home *** CD-ROM | disk | FTP | other *** search
/ Chip 1998 September / CHIP Eylül 1998.iso / Slackwar / docs / PostgreSQL-HOWTO < prev    next >
Text File  |  1997-03-18  |  473KB  |  13,314 lines

  1.   Database-SQL-RDBMS HOW-TO document for Linux (PostgreSQL Object Rela¡
  2.   tional Database System)
  3.   Al Dev (Alavoor Vasudevan)        aldev@hotmail.com
  4.   v4.0, 21 December 1997
  5.  
  6.   This document is a "practical guide" to very quickly setup a SQL
  7.   Database engine and front end tools on a Unix system. It also dis¡
  8.   cusses the International standard language ANSI/ISO SQL and reviews
  9.   about the merits/advantages of the SQL database engine developed by
  10.   the world-wide internet in an "open development" environment.  It is
  11.   about HOW-TO setup a next generation Object Relational SQL Database
  12.   "PostgreSQL" on Unix system which can be used as Application Database
  13.   Server or as Web Database Server. PostgreSQL implements subset of
  14.   International standard ISO and ANSI SQL 1998,92,89. This document also
  15.   gives information on the interface programs for the database like
  16.   Front End GUIs, RAD tools (Rapid Application Development), programming
  17.   languages interfaces ("C", "C++", Java, Perl), ODBC, JDBC drivers and
  18.   Web Database Tools and Interface programs. Information given here
  19.   applies to all Unix platforms and other databases and will be very
  20.   useful for people who are new to Databases, SQL language and Post¡
  21.   greSQL.  This document also has SQL tutorial, SQL syntax which would
  22.   be very helpful for beginners. Experienced people will find this docu¡
  23.   ment useful as a handy reference guide. For students, the information
  24.   given here will enable them to get the source code for PostgreSQL
  25.   relational database system, from which they can learn how a RDBMS SQL
  26.   database engine is written.
  27.  
  28.   1.  Introduction
  29.  
  30.   Each and every computer system in the world needs a database to
  31.   store/retrieve the information.  Without a database, a computer can
  32.   become useless. The primary reason you use the computer is to store,
  33.   retrieve and process information and do all these very quickly,
  34.   thereby saving you time.  At the same time the system must be simple,
  35.   robust, fast, reliable, economical and very easy to use.  The most
  36.   popular database systems are based on the International Standard
  37.   Organisation (ISO) SQL specifications which are also based on ANSI SQL
  38.   (American) standards.  Current specifications generally used are ANSI
  39.   SQL 92 and ANSI SQL 89.  Upcoming standard is the SQL 1998/99 which is
  40.   also called SQL-3. Popular database like Oracle, Sybase and Informix
  41.   systems are based on these standards or are trying to implement these
  42.   standards.
  43.  
  44.   As given in this document, there are more than 20 varieties of
  45.   commercial/internet database systems which are being used in the world
  46.   and many more will be coming in the near future. Without a standard
  47.   like ANSI/ISO SQL, it would be very difficult for the customer to
  48.   develop a application once and run on all the database systems.
  49.   Today's customer wants to develop an application once using ISO SQL,
  50.   ODBC, JDBC and sell it to be used on all varieties of database systems
  51.   in the world.
  52.  
  53.   The world's most popular FREE Database which implements some of the
  54.   ISO SQL, ANSI SQL/98, SQL/92 and ANSI SQL/89 RDBMS is PostgreSQL.
  55.   PostgreSQL is next generation Object relational database and the
  56.   future ANSI SQL standards like SQL 1998 (SQL-3) and beyond will
  57.   increasingly deal with Object databases and Object data types.
  58.   PostgreSQL is the only free RDBMS in the world which supports Object
  59.   databases and SQL. This document will tell you how-to install the
  60.   database and also all the packages related to databases, how to set up
  61.   the Web database, application database, front end GUIs and interface
  62.   programs.  It is strongly advised that you MUST write your database
  63.   applications 100 % compliant to standards of ISO/ANSI SQL, ODBC, JDBC
  64.   so that your application is portable across multiple databases like
  65.   PostgreSQL, Oracle, Sybase, Informix etc.
  66.  
  67.   You get the highest quality, and lot many features with PostgreSQL as
  68.   it follows 'Open Systems development model'. Open systems is the one
  69.   where the complete source code is given to you and the development
  70.   takes place on the internet by a extremely large network of human
  71.   brains.  Future trend foresees that most of the software development
  72.   will take place on the so called "Information Super-Highway" which
  73.   spans the whole globe.  In the coming years, internet growth will be
  74.   explosive which will further fuel rapid adoption of PostgreSQL by
  75.   customers.
  76.  
  77.   Applying the principles of physics (quantum, classical,
  78.   thermodynamics), mathematics and statistics to software quality, you
  79.   get the highest quality of software only in a 'Open Systems' like
  80.   PostgreSQL by opening the source code to a very vast number of human
  81.   brains interconnected by the information super-highway.  Greater the
  82.   number of human brains working, the better will be the quality of
  83.   software.  Open Systems model will also prevent re-invention of
  84.   wheels, eliminates duplication of work and will be very economical,
  85.   saves time in distribution and follows the modern economic laws of
  86.   optimizing the national and global resources.  As we will be entering
  87.   the 21st century, there will be a change in the way that you get
  88.   software for your use.  Customers will give first preference for the
  89.   open systems software like PostgreSQL.
  90.  
  91.   Buying software MAY become a thing of the past. You only need to buy
  92.   good hardware, it is worth spending money on the hardware and get the
  93.   software from internet. Important point is that it is the computer
  94.   hardware which is doing bulk of the work(99 %). Hardware is the real
  95.   work horse and software is just a minor contributor.  That is, work
  96.   done by the software is insignificant as compared to that  of the
  97.   computer hardware.  Computer hardware is so much more complex that
  98.   only 6 out of 180 countries in the world so far have demonstrated the
  99.   capability of designing and manufacturing computer chips/hardware.
  100.   Manufacturing computer chips is a super-high technology and is a very
  101.   complex process, capital intensive requiring large investments in
  102.   plant and production machines which deal with 0.25 micron technology,
  103.   billions of transistors/circuits which are densely packed on a small
  104.   silicon chip, which to date even many of the developed countries
  105.   cannot afford to manufacture!  Companies like AMD, Intel, Cyrix,
  106.   Hitachi, IBM and others spent billions of man-years to master the
  107.   high-technology like Micro-electronics and Nano-electronics.  Micro
  108.   means (one-millionth of centimeter), Nano  means (one-billionth of
  109.   centimeter). Current technology uses micro-electronics of about 0.35
  110.   micron using aluminum as conductors, 0.25 micron sizes using copper as
  111.   conductors of electrons.  In near future the technology of 0.10 micron
  112.   with copper and even nano-electronics will be used to make computer
  113.   chips.
  114.  
  115.   As you can see, it is hardware that is high technology and important
  116.   and software is a low technology and is NOT as important.  Hence,
  117.   manufacturing hardware/hard-goods is vital for national economy!
  118.   Companies like Compaq, Dell, Sun Microsystems, HP, IBM who manufacture
  119.   computers are major contributors to U.S economy today and in the
  120.   future!!
  121.  
  122.   On other hand, each and every country in the world develops/makes
  123.   software.  In fact, any person in this world with a small low-cost PC
  124.   can create a Oracle database server system!! But it would take him
  125.   about 20 years (Oracle database server is over some 20 man-years). One
  126.   man-year is one person working full-time for one full year. If 20
  127.   people work for a year than it is 20 man-years spent.
  128.  
  129.   Databases like Oracle, Informix, Sybase, IBM DB2 are written in
  130.   nothing but 100% "C" language and binaries are created by compiling
  131.   the source and than shipped to customers.
  132.  
  133.   Since a lot of work had been done on PostgreSQL for the past 12 years,
  134.   it does not make sense to re-create from scratch another database
  135.   which satisfies ANSI/ISO SQL.  It will be a great advantage to take
  136.   the existing code and add missing features or enhancements to
  137.   PostgreSQL and start using it immediately.
  138.  
  139.   PostgreSQL is not just a free database but it is a 'Internet Product'
  140.   and demands due respect and appreciation from one and all. Prediction
  141.   is that demand for "Made By Internet" products will grow exponentially
  142.   as it is capable of maintaining a high quality, low cost, extremely
  143.   large user-base and developer-base. Those nations who do not use the
  144.   'Made By Internet' products will be seriously missing "World-wide
  145.   Internet Revolution" and will be left far behind other countries.
  146.  
  147.   2.  Other Formats of this Document
  148.  
  149.   This document is published in 10 different formats namely - DVI,
  150.   Postscript, Latex, LyX, GNU-info, HTML, RTF(Rich Text Format), Plain-
  151.   text, Unix man pages and SGML.
  152.  
  153.   ╖  You can get this HOWTO document as a single file tar ball in HTML,
  154.      DVI, Postscript or SGML formats from -
  155.      <ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/other-formats/>
  156.  
  157.   ╖  Plain text format is in:
  158.      <ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO>
  159.  
  160.   ╖  Translations to other languages like French, German, Spanish,
  161.      Chinese, Japanese are in
  162.      <ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO> Any help from you to
  163.      translate to other languages is welcome.
  164.  
  165.   The document is written using a tool called "SGML tool" which can be
  166.   got from - <http://www.xs4all.nl/~cg/sgmltools/> Compiling the source
  167.   you will get the following commands like
  168.  
  169.   ╖  sgml2html databasehowto.sgml     (to generate html file)
  170.  
  171.   ╖  sgml2rtf  databasehowto.sgml     (to generate RTF file)
  172.  
  173.   ╖  sgml2latex databasehowto.sgml    (to generate latex file)
  174.  
  175.   This document is located at -
  176.  
  177.   ╖  <http://sunsite.unc.edu/LDP/HOWTO/Database-HOWTO.html>
  178.  
  179.   Also you can find this document at the following mirrors sites -
  180.  
  181.   ╖  <http://www.caldera.com/LDP/HOWTO/Database-HOWTO.html>
  182.  
  183.   ╖  <http://www.WGS.com/LDP/HOWTO/Database-HOWTO.html>
  184.  
  185.   ╖  <http://www.cc.gatech.edu/linux/LDP/HOWTO/Database-HOWTO.html>
  186.  
  187.   ╖  <http://www.redhat.com/linux-info/ldp/HOWTO/Database-HOWTO.html>
  188.  
  189.   ╖  Other mirror sites near you (network-address-wise) can be found at
  190.      <http://sunsite.unc.edu/LDP/hmirrors.html> select a site and go to
  191.      directory /LDP/HOWTO/Database-HOWTO.html
  192.  
  193.   In order to view the document in dvi format, use the xdvi program. The
  194.   xdvi program is located in tetex-xdvi*.rpm package in Redhat Linux
  195.   which can be located through ControlPanel | Applications | Publishing
  196.   | TeX menu buttons.
  197.  
  198.                To read dvi document give the command -
  199.                        xdvi -geometry 80x90 howto.dvi
  200.                And resize the window with mouse. See man page on xdvi.
  201.                To navigate use Arrow keys, Page Up, Page Down keys, also
  202.                you can use 'f', 'd', 'u', 'c', 'l', 'r', 'p', 'n' letter
  203.                keys to move up, down, center, next page, previous page etc.
  204.                To turn off expert menu press 'x'.
  205.  
  206.   You can read postscript file using the program 'gv' (ghostview) or The
  207.   ghostscript program is in ghostscript*.rpm package and gv program is
  208.   in gv*.rpm package in Redhat Linux which can be located through
  209.   ControlPanel | Applications | Graphics menu buttons. The gv program is
  210.   much more user friendly than ghostscript.
  211.  
  212.                To read postscript document give the command -
  213.                        gv howto.ps
  214.  
  215.                To use ghostscript give -
  216.                        ghostscript howto.ps
  217.  
  218.   You can read HTML format document using Netscape Navigator, Microsoft
  219.   Internet explorer, Redhat Baron Web browser or any of the 10 other web
  220.   browsers.
  221.  
  222.   3.  Laws of Physics applies to Software!
  223.  
  224.   Laws of science (Physics) applies everywhere, all the time, to
  225.   anything that you do and even to software projects like database
  226.   systems. Physics is in action even while you are talking (sound
  227.   waves), walking (friction between ground and your feet), sleeping or
  228.   writing software. Every software developer/user must have a very basic
  229.   and minimum understanding of the science - namely Physics, Quantum
  230.   Mechanics, Thermodynamics, Statistics and Mathematics. It is suggested
  231.   you give atleast one reading to a "Introductory/Basic" textbook on the
  232.   above subjects.  As per science, it is impossible to build a database
  233.   software system which will be 100 % perfect and bug free. But by
  234.   combining the energies of millions of people around the world via
  235.   internet it is possible to achieve a near perfect database software
  236.   system. Individually, the energy of each person will be minute, but by
  237.   networking a large number of people, the total energy will be huge
  238.   which can be focused on a project to generate a perfect system.  It is
  239.   very clear that internet can network a vast number of people, which
  240.   implies internet can produce high quality software products.
  241.  
  242.   Science would like every software developer and end-user not to be
  243.   narrow-single-track minded but to be open and give a chance to "The
  244.   Internet Products" like PostgreSQL, Linux, etc..
  245.  
  246.   4.  What is PostgreSQL ?
  247.  
  248.   PostgreSQL Version 6.2.1 patch level 3 is a free database, complete
  249.   source code is given to you and is a Object-Relational Database System
  250.   near compliant (getting closer) with ANSI SQL1998,92,89 and runs on
  251.   diverse hardware platforms and Operating systems.
  252.  
  253.                Sometimes emergency bug fix patches are released after the
  254.                GA release of PostgreSQL. You can apply these optional patches
  255.                depending upon the needs of your application. Follow these
  256.                steps to apply the patches -
  257.                        cd "To postgresql source directory"
  258.                        patch < "Specify a patch file here"
  259.                        make clean
  260.                        make
  261.  
  262.   The ultimate objective and the final goal of PostgreSQL is to become
  263.   100 % compliant to ANSI/ISO SQL and also to become the number ONE open
  264.   generic Database in the world. PostgreSQL will also guide, steer,
  265.   control, monitor and dictate the future of ANSI/ISO SQL.  That is, the
  266.   implementation and ideas first take place in PostgreSQL and than
  267.   latter be incorporated into the ANSI/ISO SQL. PostgreSQL is the "state
  268.   of the art" technology database.
  269.  
  270.   Informix Universal server (released 1997) is based on earlier version
  271.   of PostgreSQL because Informix bought Illustra Inc. and integrated
  272.   with Informix. Illustra database was completely based on Postgres
  273.   (earlier version of PostgreSQL).
  274.  
  275.   PostgreSQL is an enhancement of the POSTGRES database management
  276.   system, a next-generation DBMS research prototype.  While PostgreSQL
  277.   retains the powerful data model and rich data types of POSTGRES, it
  278.   replaces the PostQuel query language with an extended subset of SQL.
  279.  
  280.   PostgreSQL development is being performed by a team of Internet
  281.   developers who all subscribe to the PostgreSQL development mailing
  282.   list. The current coordinator is Marc G. Fournier
  283.   scrappy@postgreSQL.org . This team is now responsible for all current
  284.   and future development of PostgreSQL.
  285.  
  286.   The authors of PostgreSQL 1.01 were Andrew Yu and Jolly Chen.  Many
  287.   others have contributed to the porting, testing, debugging and
  288.   enhancement of the code. The original Postgres code, from which
  289.   PostgreSQL is derived, was the effort of many graduate students,
  290.   undergraduate students, and staff programmers working under the
  291.   direction of Professor Michael Stonebraker at the University of
  292.   California, Berkeley.
  293.  
  294.   The original name of the software at Berkeley was Postgres. When SQL
  295.   functionality was added in 1995, its name was changed to Postgres95.
  296.   The name was changed at the end of 1996 to PostgreSQL.
  297.  
  298.   Millions of PostgreSQL is installed as Database servers, Web database
  299.   servers and Application data servers. It is much more advanced and is
  300.   a object oriented relational database (ORDBMS).
  301.  
  302.   PostgreSQL can store more data types than traditional datatypes like
  303.   integer, characters, etc. - you get to create user-defined types,
  304.   functions, inheritance etc. (Version 7.0 will make these capabilities
  305.   even more advanced).  PostgreSQL runs on Solaris, SunOS, HPUX, AIX,
  306.   Linux, Irix, Digital Unix, BSDi,NetBSD, FreeBSD, SCO unix, NEXTSTEP,
  307.   Unixware and all and every flavor of Unix. Port to Windows 95/NT is
  308.   underway.
  309.  
  310.   ╖  Title:             PostgreSQL SQL RDBMS Database (Object Relational
  311.      Database Management System)
  312.  
  313.   ╖  Current Version:   6.2.1 patch level 3
  314.  
  315.   ╖  Age:               PostgreSQL is 12 years old. Developed since 1985
  316.  
  317.   ╖  Authors:           Developed by millions/universities/companies on
  318.      internet for the past 12 YEARS
  319.  
  320.   5.  Where to get it ?
  321.  
  322.   You can buy Redhat 4.2 Linux CDROM, Debian Linux CDROM or Slackware
  323.   Linux CDROM which already contains the postgresql in rpm package (both
  324.   source code and binaries) from :
  325.  
  326.   ╖  Linux System Labs Web site:   <http://www.lsl.com/>  7 (U.S.
  327.      dollars)
  328.  
  329.   ╖  Cheap Bytes Inc Web site:   <http://www.cheapbytes.com/> 7 (U.S.
  330.      dollars)
  331.  
  332.   ╖  Debian Main Web site contact: Oliver.Elphick@lfix.co.uk
  333.  
  334.   In near future PostgreSQL organisation will be selling 'PostgreSQL
  335.   CDROM' which will contain the complete source code and binaries for
  336.   all the Unix operating systems.
  337.  
  338.   Binaries only distribution of PostgreSQL:
  339.  
  340.   ╖  You can run PostgreSQL without compiling the source. Get binaries
  341.      for Intel-Linux from  <http://www.redhat.com/pub/contrib/i386/>
  342.      file is postgresql-6.2-3.i386.rpm. This is in the redhat package
  343.      'rpm' format and it contains both source and binaries for
  344.      PostgreSQL.
  345.  
  346.   ╖  Binaries site for Solaris, HPUX, AIX, IRIX, Linux :
  347.      <ftp://ftp.postgresql.org/pub/bindist> If you compile on any
  348.      platform please upload to site, so that it will be useful for
  349.      others.
  350.  
  351.   ╖  ftp site : Get binaries for Intel-Linux from
  352.      <ftp://ftp.redhat.com/pub/contrib/i386/> file is
  353.      postgresql-6.2-3.i386.rpm. This is in the redhat package 'rpm'
  354.      format and it contains both source and binaries for PostgreSQL.
  355.  
  356.   WWW Web sites:
  357.  
  358.   ╖  Primary Web site:   <http://www.postgresql.org/>
  359.  
  360.   ╖  Secondary Web site:      <http://logical.thought.net/postgres95/>
  361.  
  362.   ╖  <http://www.itm.tu-clausthal.de/mirrors/postgres95/>
  363.  
  364.   ╖  <http://s2k-ftp.cs.berkeley.edu:8000/postgres95/>
  365.  
  366.   ╖  <http://xenium.pdi.net/PostgreSQL/>
  367.  
  368.   ╖  <http://s2k-ftp.cs.berkeley.edu:8000/postgres95/>
  369.  
  370.   The ftp sites are listed below :-
  371.  
  372.   ╖  Primary FTP:        <ftp://ftp.postgresql.org/pub>
  373.  
  374.   ╖  Secondary FTP:      <ftp://ftp.chicks.net/pub/postgresql>
  375.  
  376.   ╖  <ftp://ftp.emsi.priv.at/pub/postgres/>
  377.  
  378.   ╖  <ftp://ftp.itm.tu-clausthal.de/pub/mirrors/postgres95>
  379.  
  380.   ╖  <ftp://rocker.sch.bme.hu/pub/mirrors/postgreSQL>
  381.  
  382.   ╖  <ftp://ftp.jaist.ac.jp/pub/dbms/postgres95>
  383.  
  384.   ╖  <ftp://ftp.luga.or.at/pub/postgres95>
  385.  
  386.   ╖  <ftp://postgres95.vnet.net:/pub/postgres95>
  387.  
  388.   ╖  <ftp://ftpza.co.za/mirrors/postgres>
  389.  
  390.   ╖  <ftp://sunsite.auc.dk/pub/databases/postgresql>
  391.  
  392.   ╖  <ftp://ftp.task.gda.pl/pub/software/postgresql>
  393.  
  394.   ╖  <ftp://xenium.pdi.net/pub/PostgreSQL>
  395.  
  396.   PostgreSQL source code is also available at all the mirror sites of
  397.   sunsite unc (total of about 1000 sites around the globe). It is inside
  398.   the Red Hat Linux distribution in /pub/contrib/i386/postgresql.rpm
  399.   file.
  400.  
  401.   ╖  For list of mirror sites go to  <ftp://sunsite.unc.edu>
  402.  
  403.   6.  PostgreSQL Supports Extremely Large Databases greater than 200 Gig
  404.  
  405.   Performance of 32-bit cpu machines will rapidly decline when the
  406.   database size exceed 5 gig. You can run 30 gig database on 32-bit cpu
  407.   but it will not be very effective. There is limitation imposed on the
  408.   amount of RAM (maximum of 2 gig only), limitation on the file system
  409.   sizes and also on the operating system.  The operating system on
  410.   32-bit cpu will be "bumping it's head" too many times on the "32-bit
  411.   ceiling".
  412.  
  413.   If you need to use extremely large databases (greater than 5
  414.   gigabytes), it is strongly advised that you use 64-bit machines like
  415.   Digital Alpha cpu, Sun Ultra-sparc 64-bit cpu, Silicon graphics 64-bit
  416.   cpu, upcoming Intel Merced IA-64 cpu, HPUX 64bit machines, IBM 64-bit
  417.   machines. Compile PostgreSQL under 64-bit cpu and it can support huge
  418.   databases and large queries. Performance of PostgreSQL for queries on
  419.   large tables and databases will be several times faster than
  420.   PostgreSQL on 32-bit cpu machines. Advantage of 64-bit machines are
  421.   that you get very large memory addressing space and the operating
  422.   system can support very large file-systems, provide better performance
  423.   with large databases, support much larger memory(RAM), have more
  424.   capabilities etc..
  425.  
  426.   7.  How can I trust PostgreSQL ? Regression Test Package builds cus¡
  427.   tomer confidence
  428.  
  429.   Regression test package (src/test/regress) is included in the
  430.   distribution and let your computer do the verification for standard
  431.   SQL operations as well as the extensibility capabilities of
  432.   PostgreSQL.  Advantage is that computer can rapidly run millions of
  433.   SQL tests in a very short time. The speed of computer is about one
  434.   billion times faster than human brain! In near future the speed of
  435.   computer will be several zillion times faster than human brain! Hence,
  436.   it makes sense to use the power of computer to validate the software
  437.   instead of using the human brain power.
  438.  
  439.   The test package already contains hundreds of SQL test programs.  You
  440.   can start the regression test (relax and have a cooldrink!) and come
  441.   back take a glance at the output results and you are done! It is that
  442.   simple and easy.
  443.  
  444.   You can add more tests just in case you need to, and can upload to the
  445.   primary PostgreSQL web site if you feel that it will be useful to
  446.   others on internet.  Regression test package helps build customer
  447.   confidence and trust in PostgreSQL and facilitates rapid deployment of
  448.   PostgreSQL on production systems without any major worries.
  449.  
  450.   Regression test package can be taken as a "very solid" technical
  451.   specification mutually agreed upon document between the developers and
  452.   end-users. PostgreSQL developers extensively use the regression test
  453.   package during development period and also before releasing the
  454.   software to public to ensure good quality.
  455.  
  456.   8.  GUI FrontEnd Tool for PostgreSQL (Graphical User Interface)
  457.  
  458.   PostgreSQL has TCL/TK interface library in the distribution called
  459.   'pgtcl'. TCL/TK is a Rapid Application Development tool and is a very
  460.   powerful scripting language.  Develop once and run it everywhere on
  461.   NT, Win 95, Linux, OS/2 and all unixes! TCL/TK is also widely used as
  462.   a Internet script language. So you will have only one language for all
  463.   your needs - applications and internet. TCL stands for 'Tool Command
  464.   Language' and TK is 'Tool Kit'. There is a IDE (integrated development
  465.   environment) for TCL/TK called SpecTCL. Check for this rpm package
  466.   under Redhat linux distribution or at the sunscript site given below.
  467.   TCL/TK is usually shipped with every linux cdrom. Also you can get it
  468.   from these sites -
  469.  
  470.   ╖  <http://sunscript.sun.com/>
  471.  
  472.   ╖  <http://sunscript.sun.com/TclTkCore/>
  473.  
  474.   ╖  <ftp://ftp.sunlabs.com/pub/tcl/tcl8.0a2.tar.Z>
  475.  
  476.   ╖  Reference text book: Many textbooks on TCL/TK are available in the
  477.      market.
  478.  
  479.   ╖  Visual TCL  <ftp://ftp.redhat.com/pub/contrib/i386/visualtcl*.rpm>
  480.  
  481.   9.  Integrated Development Environment Tools for PostgreSQL (GUI IDE)
  482.  
  483.   Check out the following development tools which you can use in
  484.   conjunction with ODBC/JDBC drivers. These are similar to Borland C++
  485.   Builder, Borland JBuilder.
  486.   Vibe is a Java and C++ IDE (Integrated Development Environment) that
  487.   won Unix Review's IDE of the year. This 800 US dollars product is
  488.   available for Linux at a very special low price 79 US dollars for a
  489.   limited time.  Check it out! This is a developer's dream.
  490.  
  491.   ╖  More information on Vibe at
  492.      <http://www.LinuxMall.com/products/00487.html>
  493.  
  494.      You can also use Borland C++ Builder, Delphi, Borland JBuilder,
  495.      PowerBuilder on Windows95 connecting to PostgreSQL on unix box
  496.      through ODBC/JDBC drivers.
  497.  
  498.   Free of cost IDE Tools -
  499.  
  500.   Check the CDROM of redhat linux distribution.
  501.  
  502.   ╖  FreeBuilder  <ftp://ftp.redhat.com/pub/contrib/i386/free*.rpm>
  503.  
  504.   ╖  SpecTCL  <ftp://ftp.redhat.com/pub/contrib/i386/spec*.rpm>
  505.  
  506.   ╖  JccWarrior  <ftp://ftp.redhat.com/pub/contrib/i386/jcc*.rpm>
  507.  
  508.   ╖  Applixware Tool  <http://www.redhat.com>
  509.  
  510.   ╖  XWPE X Windows Programming Environment
  511.      <http://www.rpi.edu/~payned/xwpe/>
  512.      <ftp://ftp.redhat.com/pub/contrib/i386/xwpe*.rpm>
  513.  
  514.   ╖  XWB X Windows Work Bench
  515.      <ftp://ftp.redhat.com/pub/contrib/i386/xwb*.rpm>
  516.  
  517.   ╖  NEdit  <ftp://ftp.redhat.com/pub/contrib/i386/nedit*.rpm>
  518.  
  519.   10.  Kanchenjunga - Java RAD Tool for PostgreSQL
  520.  
  521.   Kanchenjunga is a Java Rapid Application Tool for PostgreSQL. You can
  522.   use this tool to develop rapidly the java application interfacing
  523.   PostgreSQL.
  524.  
  525.   ╖  <http://www.man.ac.uk/~whaley/kj/kanch.html>
  526.  
  527.   11.  Interface Drivers for PostgreSQL
  528.  
  529.   11.1.  ODBC Drivers for PostgreSQL
  530.  
  531.   ODBC stands for 'Open DataBase Connectivity' is a popular standard for
  532.   accessing information from various databases from different vendors.
  533.   Applications written using the ODBC drivers are guaranteed to work
  534.   with various databases like PostgreSQL, Oracle, Sybase, Informix etc..
  535.  
  536.   ╖  <http://www.openlinksw.com> Open Link Software Corporation is
  537.      selling ODBC for PostgreSQL and other databases.  Open Link also is
  538.      giving away free ODBC (limited seats) check them out.
  539.  
  540.   ╖  <http://stud1.tuwien.ac.at/~e9025461/> This is the primary PostODBC
  541.      (PostgreSQL ODBC) site. Unfortunately it has proved to be rather
  542.      slow for sites that are not located in Austria.
  543.  
  544.   ╖  <http://www.MageNet.com/postodbc/DOC> This mirror is maintained by
  545.      Julia Anne Case who is also a major PostODBC developer.
  546.   There is an interesting project called the FreeODBC Pack Package .
  547.   There's no PostgreSQL Version there, maybe you can help.
  548.  
  549.   ╖  <http://www.ids.net/~bjepson/freeODBC/> This is a cost free version
  550.      of ODBC.
  551.  
  552.   11.2.  UDBC Drivers for PostgreSQL
  553.  
  554.   UDBC is a static version of ODBC independent of driver managers and
  555.   DLL support, used to embed database connectivity support directly into
  556.   applications.
  557.  
  558.   ╖  <http://www.openlinksw.com> Open Link Software Corporation is
  559.      selling UDBC for PostgreSQL and other databases.  Open Link also is
  560.      giving away free UDBC (limited seats) check them out.
  561.  
  562.   11.3.  JDBC Drivers for PostgreSQL
  563.  
  564.   JDBC stands for 'Java DataBase Connectivity'. Java is a platform
  565.   independent programming language developed by Sun Microsystems. Java
  566.   programmers are encouraged to write database applications using the
  567.   JDBC to facilitate portability across databases like PostgreSQL,
  568.   Oracle, informix, etc. If you write Java applications you can get JDBC
  569.   drivers for PostgreSQL from the following sites:
  570.  
  571.   JDBC driver is already included in the PostgreSQL distribution.
  572.  
  573.   ╖  <http://www.demon.co.uk/finder/postgres/index.html> Sun's Java
  574.      connectivity to PostgreSQL
  575.  
  576.   ╖  <ftp://ftp.ai.mit.edu/people/rst/rst-jdbc.tar.gz>
  577.  
  578.   ╖  <http://www.openlinksw.com> Open Link Software Corporation is
  579.      selling JDBC for PostgreSQL and other databases.  Open Link also is
  580.      giving away free JDBC (limited seats) check them out.
  581.  
  582.   11.4.  Java Classes for PostgreSQL
  583.  
  584.   Java programmers can find these classes for PostgreSQL very useful.
  585.  
  586.   ╖  <ftp://www.blackdown.org/pub/Java/Java-Postgres95>
  587.  
  588.   ╖  <http://www.blackdown.org>
  589.  
  590.   12.  Perl Database Interface (DBI) Driver for PostgreSQL
  591.  
  592.   12.1.  Perl 5 interface for PostgreSQL
  593.  
  594.   It is included in the distribution of PostgreSQL. Check in
  595.   src/pgsql_perl5 directory.
  596.  
  597.   ╖  Email: E.Mergl@bawue.de
  598.  
  599.   ╖  Another source from -
  600.  
  601.   ╖  Perl Home page :
  602.  
  603.   12.2.  WHAT IS DBI ?
  604.  
  605.   The Perl Database Interface (DBI) is a database access Application
  606.   Programming Interface (API) for the Perl Language. The Perl DBI API
  607.   specification defines a set of functions, variables and conventions
  608.   that provide a consistent database interface independent of the actual
  609.   database being used.
  610.  
  611.   12.3.  Announcement DBD-Pg-0.63 DBI driver for PostgreSQL
  612.  
  613.   On its way to CPAN is DBD-Pg-0.63.tar.gz.  Since the last public
  614.   release the following changes have been made:
  615.  
  616.   - - adapted to PostgreSQL-6.2: o $ sth->rows as well as $ sth->execute
  617.   and $ sth->do return the number of affected rows even for non-Select
  618.   statements.  o support for password authorization added, please check
  619.   the man-page for pg_passwd.
  620.  
  621.   - - the data_source parameter of the connect method accepts two
  622.   additional parameters which are  treated as host and port:
  623.   DBI->connect("dbi:Pg:dbname:host:port", "uid", "pwd")
  624.  
  625.   - - support for AutoCommit, please read the module documentation for
  626.   impacts on your scripts !
  627.  
  628.   - - more perl-ish handling of data type bool, please read the module
  629.   documentation for impacts on your scripts !
  630.  
  631.   for further information see:
  632.  
  633.   12.4.  Release Notes and ReadMe file
  634.  
  635.        #---------------------------------------------------------
  636.        #
  637.        # $Id: README,v 1.10 1997/10/05 18:25:55 mergl Exp $
  638.        #
  639.        # Portions Copyright (c) 1994,1995,1996,1997 Tim Bunce
  640.        # Portions Copyright (c) 1997                Edmund Mergl
  641.        #
  642.        #---------------------------------------------------------
  643.  
  644.        **********************************************************
  645.        *                                                        *
  646.        *            This release makes changes which are        *
  647.        *                      INCOMPATIBLE                      *
  648.        *                      ------------                      *
  649.        *                  to previous releases.                 *
  650.        *                                                        *
  651.        *        Please check the module documentation           *
  652.        *             for the attribute AutoCommit               *
  653.        *               and for the data type bool.              *
  654.        *                                                        *
  655.        **********************************************************
  656.  
  657.   DESCRIPTION:
  658.  
  659.   ------------
  660.  
  661.   This is version 0.63 of DBD-Pg.  DBD-Pg is a PostgreSQL interface for
  662.   Perl 5 using DBI.
  663.  
  664.   For further information about DBI look at:
  665.  
  666.   COPYRIGHT:
  667.  
  668.   ----------
  669.  
  670.   You may distribute under the terms of either the GNU General Public
  671.   License or the Artistic License, as specified in the Perl README file.
  672.  
  673.   IF YOU HAVE PROBLEMS:
  674.  
  675.   ---------------------
  676.  
  677.   Please send comments and bug-reports to E.Mergl@bawue.de
  678.  
  679.   Please include the output of perl -v, and perl -V, the version of
  680.   PostgreSQL, the version of DBD-Pg, and the version of DBI in your bug-
  681.   report.
  682.  
  683.   REQUIREMENTS:
  684.  
  685.   -------------
  686.  
  687.   - build, test and install Perl 5         (at least 5.002) - build,
  688.   test and install the DBI module (at least 0.89) - build, test and
  689.   install PostgreSQL     (at least 6.2)
  690.  
  691.   PLATFORMS:
  692.  
  693.   ----------
  694.  
  695.   This release of DBD-Pg has been developed using Linux 2.0 with dynamic
  696.   loading for the perl extensions. Let me know, if there are any
  697.   problems with other platforms.
  698.  
  699.   INSTALLATION:
  700.  
  701.   -------------
  702.  
  703.   The Makefile checks the environment variable POSTGRES_HOME as well
  704.   some standard locations, to find the root directory of your Postgres
  705.   installation.
  706.  
  707.   1.   perl Makefile.PL 2.   make 3.   make test 4.   make install
  708.  
  709.   ( 1. to 3. as normal user, not as root ! )
  710.  
  711.   TESTING:
  712.  
  713.   --------
  714.  
  715.   Run 'make test'.  Note, that the user running this script must have
  716.   been created with the access rights to create databases *AND* users !
  717.   Do not run this script as root !
  718.  
  719.   If testing fails with the message 'login failed', please check if
  720.   access to the database template1 as well as pgperltest is not
  721.   protected in pg_hba.conf.
  722.  
  723.   If you are using the shared library libpq.so check if your dynamic
  724.   loader finds libpq.so. With Linux the command /sbin/ldconfig -v should
  725.   tell you, where it finds libpq.so. If ldconfig does not find libpq.so,
  726.   either add an appropriate entry to /etc/ld.so.conf and re-run ldconfig
  727.   or add the path to the environment variable LD_LIBRARY_PATH.  A
  728.   typical error message resulting from not finding libpq.so is:
  729.   install_driver(Pg) failed: Can't load './blib/arch/auto/DBD/Pg/Pg.so'
  730.   for module DBD::Pg: File not found at
  731.  
  732.   Some linux distributions have an incomplete perl installation.  If you
  733.   have compile errors like "XS_VERSION_BOOTCHECK undeclared", make a If
  734.   this file is not present, you need to recompile and reinstall perl.
  735.  
  736.   SGI users: if you get segmentation faults make sure, you use the
  737.   malloc which comes with perl when compiling perl (the default is not
  738.   to).  "David R. Noble" drnoble@engsci.sandia.gov
  739.   drnoble@engsci.sandia.gov
  740.  
  741.   ---------------------------------------------------------------------------
  742.  
  743.   E.Mergl@bawue.de                     October 05, 1997
  744.  
  745.   ---------------------------------------------------------------------------
  746.  
  747.   12.5.  FAQ for DBI
  748.  
  749.   Below is the Frequently Asked question FAQ for DBI. The main web page
  750.   is at
  751.  
  752.   <http://www.hermetica.com/technologia/perl/DBI>
  753.  
  754.                      DBI Frequently Asked Questions v.0.35
  755.                          Last updated: June 20th, 1997
  756.  
  757.   * NAME
  758.   * SYNOPSIS
  759.   * VERSION
  760.   * DESCRIPTION
  761.   * Basic Information & Information Sources
  762.  
  763.      * 1.1 What is DBI, DBperl, Oraperl and *perl?
  764.      * 1.2. Where can I get it from?
  765.      * 1.3. Where can I get more information?
  766.  
  767.   * Compilation Problems
  768.  
  769.      * 2.1. Compilation problems or "It fails the test!"
  770.  
  771.   * Platform and Driver Issues
  772.  
  773.      * 3.1 What's the difference between ODBC and DBI?
  774.      * 3.2 Is DBI supported under Windows 95 / NT platforms?
  775.      * 3.3 Can I access Microsoft Access or SQL-Server databases with DBI?
  776.      * 3.4 Is the a DBD for >?
  777.      * 3.5 What's DBM? And why should I use DBI instead?
  778.      * 3.6 When will mSQL-2 be supported?
  779.      * 3.7 What database do you recommend me using?
  780.      * 3.8 Is > supported in DBI?
  781.  
  782.   * Programming Questions
  783.  
  784.      * 4.1 Is DBI any use for CGI programming?
  785.      * 4.2 How do I get faster connection times with DBD::Oracle and CGI?
  786.      * 4.3 How do I get persistent connections with DBI and CGI?
  787.      * 4.4 ``When I run a perl script from the command line, it works, but,
  788.        when I run it under the C, it fails!'' Why?
  789.      * 5.1 Can I do multi-threading with DBI?
  790.      * 5.2 How do I handle BLOB data with DBI?
  791.      * 5.3 How can I invoke stored procedures with DBI?
  792.      * 5.4 How can I get return values from stored procedures with DBI?
  793.      * 5.5 How can I create or drop a database with DBI?
  794.      * 5.6 How can I C or C a statement with DBI?
  795.      * 5.7 How are C values handled by DBI?
  796.      * 5.8 What are these C methods all about?
  797.  
  798.   * Support and Training
  799.  
  800.      * Commercial Support
  801.      * Training
  802.  
  803.   * Other References
  804.   * AUTHOR
  805.  
  806.   ----------------------------------------------------------------------------
  807.  
  808.   NAME
  809.  
  810.   DBI::FAQ -- The Frequently Asked Questions for the Perl5 Database Interface
  811.  
  812.   ----------------------------------------------------------------------------
  813.  
  814.   SYNOPSIS
  815.  
  816.       perldoc DBI::FAQ
  817.  
  818.   ----------------------------------------------------------------------------
  819.  
  820.   VERSION
  821.  
  822.   This document is currently at version 0.35, as of June 20th, 1997.
  823.  
  824.   ----------------------------------------------------------------------------
  825.  
  826.   DESCRIPTION
  827.  
  828.   This document serves to answer the most frequently asked questions on both
  829.   the DBI Mailing Lists and personally to members of the DBI development team.
  830.  
  831.   ----------------------------------------------------------------------------
  832.  
  833.   Basic Information & Information Sources
  834.  
  835.   ----------------------------------------------------------------------------
  836.  
  837.   1.1 What is DBI, DBperl, Oraperl and *perl?
  838.  
  839.   To quote Tim Bunce, the architect and author of DBI:
  840.  
  841.       ``DBI is a database access Application Programming Interface (API)
  842.         for the Perl Language. The DBI API Specification defines a set
  843.         of functions, variables and conventions that provide a consistent
  844.         database interface independent of the actual database being used.''
  845.  
  846.   In simple language, the DBI interface allows users to access multiple
  847.   database types transparently. So, if you connecting to an Oracle, Informix,
  848.   mSQL, Sybase or whatever database, you don't need to know the underlying
  849.   mechanics of the 3GL layer. The API defined by DBI will work on all these
  850.   database types.
  851.  
  852.   A similar benefit is gained by the ability to connect to two different
  853.   databases of different vendor within the one perl script, ie, I want to read
  854.   data from an Oracle database and insert it back into an Informix database
  855.   all within one program. The DBI layer allows you to do this simply and
  856.   powerfully.
  857.  
  858.   Here's a diagram that demonstrates the principle:
  859.  
  860.                               [ DBI Architecture ]
  861.  
  862.   DBperl is the old name for the interface specification. It's usually now
  863.   used to denote perl4 modules on database interfacing, such as, oraperl,
  864.   isqlperl, ingperl and so on. These interfaces didn't have a standard API and
  865.   are generally not supported.
  866.  
  867.   Here's a list of DBperl modules, their corresponding DBI counterparts and
  868.   support information. Please note, the author's listed here generally do not
  869.   maintain the DBI module for the same database. These email addresses are
  870.   unverified and should only be used for queries concerning the perl4 modules
  871.   listed below. DBI driver queries should be directed to the dbi-users mailing
  872.   list.
  873.  
  874.       Module Name Database Required   Author          DBI
  875.       ----------- -----------------   ------          ---
  876.       Sybperl     Sybase              Michael Peppler DBD::Sybase
  877.                                       <mpeppler@itf.ch>
  878.       Oraperl     Oracle 6 & 7        Kevin Stock     DBD::Oracle
  879.                                       <dbi-users@fugue.com>
  880.       Ingperl     Ingres              Tim Bunce &     DBD::Ingres
  881.                                       Ted Lemon
  882.                                       <dbi-users@fugue.com>
  883.       Interperl   Interbase           Buzz Moschetti  DBD::Interbase
  884.                                       <buzz@bear.com>
  885.       Uniperl     Unify 5.0           Rick Wargo      None
  886.                                       <rickers@coe.drexel.edu>
  887.       Pgperl      Postgres            Igor Metz       DBD::Pg
  888.                                       <metz@iam.unibe.ch>
  889.       Btreeperl   NDBM                John Conover    SDBM?
  890.                                       <john@johncon.com>
  891.       Ctreeperl   C-Tree              John Conover    None
  892.                                       <john@johncon.com>
  893.       Cisamperl   Informix C-ISAM     Mathias Koerber None
  894.                                       <mathias@unicorn.swi.com.sg>
  895.       Duaperl     X.500 Directory     Eric Douglas    None
  896.                   User Agent
  897.  
  898.   However, some DBI modules have DBperl emulation layers, so, DBD::Oracle
  899.   comes with an Oraperl emulation layer, which allows you to run legacy
  900.   oraperl scripts without modification. The emulation layer translates the
  901.   oraperl API calls into DBI calls and executes them through the DBI switch.
  902.  
  903.   Here's a table of emulation layer information:
  904.  
  905.       Module                  Emulation Layer     Status
  906.       ------          ---------------     ------
  907.       DBD::Oracle     Oraperl             Complete
  908.       DBD::Informix   Isqlperl            Under development
  909.       DBD::Sybase     Sybperl             Working? ( Needs verification )
  910.       DBD::mSQL       Msqlperl            Experimentally released with
  911.                                           DBD::mSQL-0.61
  912.  
  913.   The Msqlperl emulation is a special case. Msqlperl is a perl5 driver for
  914.   mSQL databases, but does not conform to the DBI Specification. It's use is
  915.   being deprecated in favour of DBD::mSQL. Msqlperl may be downloaded from
  916.   CPAN via:
  917.  
  918.       http://www.perl.com/cgi-bin/cpan_mod?module=Msqlperl
  919.  
  920.   ----------------------------------------------------------------------------
  921.  
  922.   1.2. Where can I get it from?
  923.  
  924.   DBI is primarily distributed from:
  925.  
  926.       ftp://ftp.demon.co.uk/pub/perl/db
  927.  
  928.   The Comprehensive Perl Archive Network resources should be used for
  929.   retrieving up-to-date versions of the drivers, since local mirror sites
  930.   usually lag. CPAN may be accessed via Tom Christiansen's splendid CPAN
  931.   multiplexer program located at:
  932.  
  933.       http://www.perl.com/CPAN/
  934.  
  935.   For more specific version information and exact URLs of drivers, please see
  936.   the DBI drivers list and the DBI module pages which can be found on:
  937.  
  938.       http://www.hermetica.com/technologia/perl/DBI
  939.  
  940.   ----------------------------------------------------------------------------
  941.  
  942.   1.3. Where can I get more information?
  943.  
  944.   There are a few information sources on DBI.
  945.  
  946.   DBI Specification
  947.  
  948.            http://www.hermetica.com/technologia/perl/DBI/doc/dbispec
  949.  
  950.        There are two specifications available at this link, the new DBI Draft
  951.        Specification which is a rapidly changing document as the development
  952.        team drive towards a stable interface, and the old historical DBperl
  953.        Specification out of which the current DBI interface evolved.
  954.  
  955.        The latter document should be regarded as being of historical interest
  956.        only and should not serve as a programming manual, or authoratative in
  957.        any sense. However, it is still a very useful reference source.
  958.  
  959.   POD documentation
  960.        PODs are chunks of documentation usually embedded within perl programs
  961.        that document the code ``in place'', providing a useful resource for
  962.        programmers and users of modules. POD for DBI and drivers is beginning
  963.        to become more commonplace, and documentation for these modules can be
  964.        read with the following commands.
  965.  
  966.        The DBI Specification
  967.             The POD for the DBI Specification can be read with the:
  968.  
  969.                 perldoc DBI
  970.  
  971.             command.
  972.  
  973.        Oraperl
  974.             Users of the Oraperl emulation layer bundled with DBD::Oracle, may
  975.             read up on how to program with the Oraperl interface by typing:
  976.  
  977.                 perldoc Oraperl
  978.  
  979.             This will produce an updated copy of the original oraperl man page
  980.             written by Kevin Stock for perl4. The oraperl API is fully listed
  981.             and described there.
  982.  
  983.        DBD::mSQL
  984.             Users of the DBD::mSQL module may read about some of the private
  985.             functions and quirks of that driver by typing:
  986.  
  987.                 perldoc DBD::mSQL
  988.  
  989.        Frequently Asked Questions
  990.             This document, the Frequently Asked Questions is also available as
  991.             POD documentation! You can read this on your own system by typing:
  992.  
  993.                 perldoc DBI::FAQ
  994.  
  995.             This may be more convenient to people not permanently, or
  996.             conveniently, connected to the Internet.
  997.  
  998.        POD in general
  999.             Information on writing POD, and on the philosophy of POD in
  1000.             general, can be read by typing:
  1001.  
  1002.                 perldoc perlpod
  1003.  
  1004.             Users with the Tk module installed may be interested to learn
  1005.             there is a Tk-based POD reader available called tkpod, which
  1006.             formats POD in a convenient and readable way.
  1007.  
  1008.   Rambles, Tidbits and Observations
  1009.  
  1010.            http://www.hermetica.com/technologia/perl/DBI/tidbits
  1011.  
  1012.        There are a series of occasional rambles from various people on the DBI
  1013.        mailing lists who, in an attempt to clear up a simple point, end up
  1014.        drafting fairly comprehensive documents. These are quite often varying
  1015.        in quality, but do provide some insights into the workings of the
  1016.        interfaces.
  1017.  
  1018.   ``DBI -- The perl5 Database Interface''
  1019.        This is an article written by Alligator Descartes and Tim Bunce on the
  1020.        structure of DBI. It was published in issue 5 of ``The Perl Journal''.
  1021.        It's extremely good. Go buy the magazine. In fact, buy all of them!
  1022.        ``The Perl Journal''s WWW site is:
  1023.  
  1024.            http://www.tpj.com
  1025.  
  1026.   ``DBperl''
  1027.        This article, published in the November 1996 edition of ``Dr. Dobbs
  1028.        Journal'' concerned DBperl. The author of this edition apparently did
  1029.        not bother to contact any of the DBI development team members for
  1030.        verification of the information contained within his article. Several
  1031.        reviews of the article on the dbi-users mailing list were disparaging,
  1032.        to say the least. The fact the article was written about DBperl instead
  1033.        of DBI hints at the staleness of the information.
  1034.  
  1035.        However, we include the reference for completeness' sake.
  1036.  
  1037.   ``The Perl5 Database Interface''
  1038.        This item is a book to be written by Alligator Descartes ( for it is me
  1039.        ) and published by O'Reilly and Associates this coming Winter.
  1040.  
  1041.        Here is the putative table of contents for the book.
  1042.  
  1043.             * Introduction
  1044.                  + Databases
  1045.                  + CGI / WWW
  1046.                  + perl
  1047.             * Basic Database Concepts
  1048.                  + Types of Database
  1049.                       o Flat File
  1050.                       o AnyDBM
  1051.                       o RDBMS
  1052.                  + Using Which Database For What...
  1053.             * SQL
  1054.                  + Why SQL?
  1055.                  + Structuring Information In Databases
  1056.                  + Retrieving Data From Databases
  1057.                  + Manipulating Data and Data Structures
  1058.             * DBI Architecture
  1059.             * Programming with DBI
  1060.                  + DBI Initialization
  1061.                  + Handles
  1062.                       o Driver Handles
  1063.                       o Database Handles
  1064.                       o Statement Handles
  1065.                  + Connection and Disconnection
  1066.                  + Handling Errors
  1067.                  + Issuing Simple Queries
  1068.                  + Executing Atomic Statements
  1069.                  + Statement MetaData
  1070.                  + More perl-ish Statements
  1071.                  + Binding
  1072.                  + Transaction Handling
  1073.                  + Utility Methods
  1074.                  + Handle Attributes and Dynamic Variables
  1075.             * DBI and ODBC
  1076.             * The Database Drivers
  1077.                  + DBD::Oracle and oraperl
  1078.                  + DBD::Informix and isqlperl
  1079.                  + DBD::mSQL and Msqlperl
  1080.             * Case Studies
  1081.                  + DBI and the WWW
  1082.                  + Data Migration and Warehousing
  1083.                  + Administration Software
  1084.             * Appendix: API Reference / Specification
  1085.             * Appendix: Resources
  1086.  
  1087.   README files
  1088.        The README files included with each driver occasionally contains some
  1089.        useful information ( no, really! ) that may be pertinent to the user.
  1090.        Please read them. It makes our worthless existences more bearable.
  1091.        These can all be read from the main DBI WWW page at:
  1092.  
  1093.            http://www.hermetica.com/technologia/perl/DBI
  1094.  
  1095.   Mailing Lists
  1096.        There are three mailing lists for DBI run by Ted Lemon. These can all
  1097.        be subscribed to and unsubscribed from via the World Wide Web at the
  1098.        URL of:
  1099.  
  1100.            http://www.fugue.com/dbi
  1101.  
  1102.        The lists that users may participate in are:
  1103.  
  1104.        dbi-announce
  1105.             This mailing list is for announcements only. Very low traffic. The
  1106.             announcements are usually posted on the main DBI WWW page.
  1107.  
  1108.             If you cannot successfully use the form on the above WWW page,
  1109.             please subscribe to the list in the following manner:
  1110.  
  1111.                 Email: 'dbi-announce-request@fugue.com' with a message body of
  1112.                 'subscribe'
  1113.  
  1114.        dbi-dev
  1115.             This mailing list is intended for the use of developers discussing
  1116.             ideas and concepts for the DBI interface, API and driver
  1117.             mechanics. Only any use for developers, or interested parties. Low
  1118.             traffic.
  1119.  
  1120.             If you cannot successfully use the form on the above WWW page,
  1121.             please subscribe to the list in the following manner:
  1122.  
  1123.                 Email: 'dbi-dev-request@fugue.com' with a message body of
  1124.                 'subscribe'
  1125.  
  1126.        dbi-users
  1127.             This mailing list is a general discussion list used for bug
  1128.             reporting, problem discussion and general enquiries. Medium
  1129.             traffic.
  1130.  
  1131.             If you cannot successfully use the form on the above WWW page,
  1132.             please subscribe to the list in the following manner:
  1133.  
  1134.                 Email: 'dbi-users-request@fugue.com' with a message body of
  1135.                 'subscribe'
  1136.  
  1137.   Mailing List Archives
  1138.        US Mailing List Archives
  1139.  
  1140.                 http://outside.organic.com/mail-archives/dbi-users/
  1141.  
  1142.             Searchable hypermail archives of the three mailing lists, and some
  1143.             of the much older traffic have been set up for users to browse.
  1144.  
  1145.        European Mailing List Archives
  1146.  
  1147.                 http://www.rosat.mpe-garching.mpg.de/mailing-lists/PerlDB-Interest
  1148.  
  1149.             As per the US archive above.
  1150.   ----------------------------------------------------------------------------
  1151.  
  1152.   Compilation Problems
  1153.  
  1154.   ----------------------------------------------------------------------------
  1155.  
  1156.   2.1. Compilation problems or "It fails the test!"
  1157.  
  1158.   First off, consult the online information about the module, beit DBI itself,
  1159.   or a DBD, and see if it's a known compilation problem on your architecture.
  1160.   These documents can be found at:
  1161.  
  1162.       http://www.hermetica.com/technologia/perl/DBI
  1163.  
  1164.   If it's a known problem, you'll probably have to wait till it gets fixed. If
  1165.   you're really needing it fixed, try the following:
  1166.  
  1167.   Attempt to fix it yourself
  1168.        This technique is generally not recommended to the faint-hearted. If
  1169.        you do think you have managed to fix it, then, send a patch file (
  1170.        context diff ) to the author with an explanation of:
  1171.  
  1172.           o What the problem was, and test cases, if possible.
  1173.  
  1174.           o What you needed to do to fix it. Please make sure you mention
  1175.             everything.
  1176.  
  1177.           o Platform information, database version, perl version, module
  1178.             version and DBI version.
  1179.  
  1180.   Email the author Do NOT whinge!
  1181.        Please email the address listed in the WWW pages for whichever driver
  1182.        you are having problems with. Do not directly email the author at a
  1183.        known address unless it corresponds with the one listed.
  1184.  
  1185.        We tend to have real jobs to do, and we do read the mailing lists for
  1186.        problems. Besides, we may not have access to <insert your favourite
  1187.        brain-damaged platform here> and couldn't be of any assistance anyway!
  1188.        Apologies for sounding harsh, but that's the way of it!
  1189.  
  1190.        However, you might catch one of these creative genii at 3am when we're
  1191.        doing this sort of stuff anyway, and get a patch within 5 minutes. The
  1192.        atmosphere in the DBI circle is that we do appreciate the users'
  1193.        problems, since we work in similar environments.
  1194.  
  1195.        If you are planning to email the author, please furnish as much
  1196.        information as possible, ie:
  1197.  
  1198.           o ALL the information off the README file in the problematic module.
  1199.             And we mean ALL of it. We don't put lines like that in
  1200.             documentation for the good of our health, or to meet obscure
  1201.             README file standards of length.
  1202.  
  1203.           o If you have a core dump, try the Devel::CoreStack module for
  1204.             generating a stack trace from the core dump. Send us that too.
  1205.             Devel::CoreStack can be found on CPAN at:
  1206.  
  1207.                 http://www.perl.com/cgi-bin/cpan_mod?module=Devel::CoreStack
  1208.  
  1209.           o Module versions, perl version, test cases, operating system
  1210.             versions and any other pertinent information.
  1211.  
  1212.        Remember, the more information you send us, the quicker we can track
  1213.        problems down. If you send us nothing, expect nothing back.
  1214.  
  1215.   Email the dbi-users Mailing List
  1216.        It's usually a fairly intelligent idea to cc the mailing list anyway
  1217.        with problems. The authors all read the lists, so you lose nothing by
  1218.        mailing there.
  1219.  
  1220.   ----------------------------------------------------------------------------
  1221.  
  1222.   Platform and Driver Issues
  1223.  
  1224.   ----------------------------------------------------------------------------
  1225.  
  1226.   3.1 What's the difference between ODBC and DBI?
  1227.  
  1228.   Good question! To be filled in more detail!
  1229.  
  1230.   ----------------------------------------------------------------------------
  1231.  
  1232.   3.2 Is DBI supported under Windows 95 / NT platforms?
  1233.  
  1234.   Finally, yes! Jeff Urlwin has been working diligently on building DBI and
  1235.   DBD::Oracle under these platforms, and, with the advent of a stabler perl
  1236.   and a port of MakeMaker, the project has come on by great leaps and bounds.
  1237.  
  1238.   The DBI and DBD::Oracle Win32 ports are now a standard part of DBI, so,
  1239.   downloading DBI of version higher than 0.81 should work fine. For the
  1240.   DBD::Oracle patches required, please read the Win32 porting page at:
  1241.  
  1242.       http://www.hermetica.com/technologia/perl/DBI/win32
  1243.  
  1244.   ----------------------------------------------------------------------------
  1245.  
  1246.   3.3 Can I access Microsoft Access or SQL-Server databases with DBI?
  1247.  
  1248.       Contributed by Tim Bunce and Jeff Urlwin
  1249.  
  1250.   Supplied with DBI-0.79 ( and later ) is an experimental DBI 'emulation
  1251.   layer' for the Win32::ODBC module. It's called DBI::W32ODBC and is, at the
  1252.   moment, very minimal. You will need the Win32::ODBC module available from:
  1253.  
  1254.       http://www.roth.net
  1255.  
  1256.   Given its status, problem reports without fixes are likely to be ignored.
  1257.   You will also need the Win32 DBI patch kit as supplied by Jeff Urlwin, which
  1258.   you can locate by reading the previous question's answer.
  1259.  
  1260.   Jeff Urlwin is currently working hard on the ODBC layer.
  1261.  
  1262.   To get back to the question, theoretically, yes, you can access Microsoft
  1263.   Access and SQL-Server databases from DBI via ODBC!
  1264.  
  1265.   ----------------------------------------------------------------------------
  1266.  
  1267.   3.4 Is the a DBD for <insert favourite database here>?
  1268.  
  1269.   Is is listed on the DBI drivers page?
  1270.  
  1271.       http://www.hermetica.com/technologia/perl/DBI/DBD
  1272.  
  1273.   If not, no. A complete absence of a given database driver from that page
  1274.   means that no-one has announced any intention to work on it.
  1275.  
  1276.   A corollary of the above statement implies that if you see an announcement
  1277.   for a driver not on the above page, there's a good chance it's not actually
  1278.   a DBI driver, and may not conform to the specifications. Therefore,
  1279.   questions concerning problems with that code should not really be addressed
  1280.   to the DBI Mailing Lists.
  1281.  
  1282.   ----------------------------------------------------------------------------
  1283.  
  1284.   3.5 What's DBM? And why should I use DBI instead?
  1285.  
  1286.   Extracted from ``DBI - The Database Interface for Perl 5'':
  1287.  
  1288.       ``UNIX was originally blessed with simple file-based ``databases'', namely
  1289.       the dbm system. dbm lets you store data in files, and retrieve
  1290.       that data quickly. However, it also has serious drawbacks.
  1291.  
  1292.           File Locking
  1293.  
  1294.           The dbm systems did not allow particularly robust file locking
  1295.           capabilities, nor any capability for correcting problems arising through
  1296.           simultaneous writes [ to the database ].
  1297.  
  1298.           Arbitrary Data Structures
  1299.  
  1300.           The dbm systems only allows a single fixed data structure:
  1301.           key-value pairs. That value could be a complex object, such as a
  1302.           [ C ] struct, but the key had to be unique. This was a large
  1303.           limitation on the usefulness of dbm systems.
  1304.  
  1305.       However, dbm systems still provide a useful function for users with
  1306.       simple datasets and limited resources, since they are fast, robust and
  1307.       extremely well-tested. Perl modules to access dbm systems have now
  1308.       been integrated into the core Perl distribution via the
  1309.       AnyDBM_File module.''
  1310.  
  1311.   To sum up, DBM is a perfectly satisfactory solution for essentially
  1312.   read-only databases, or small and simple datasets. However, for more
  1313.   powerful and scaleable datasets, not to mention robust transactional
  1314.   locking, users are recommended to use DBI.
  1315.  
  1316.   ----------------------------------------------------------------------------
  1317.  
  1318.   3.6 When will mSQL-2 be supported?
  1319.  
  1320.   As of DBD::mSQL-0.61, there has been support for mSQL-2. However, there is
  1321.   no real support for any of the new methods added to the core mSQL library
  1322.   regarding index support yet. These are forthcoming and will be accessible
  1323.   via func methods private to DBD::mSQL. You can read more about these private
  1324.   methods in the DBD::mSQL POD that can be found by typing:
  1325.  
  1326.       perldoc DBD::mSQL
  1327.  
  1328.   provided you have DBD::mSQL correctly installed.
  1329.  
  1330.   ----------------------------------------------------------------------------
  1331.  
  1332.   3.7 What database do you recommend me using?
  1333.  
  1334.   This is a particularly thorny area in which an objective answer is difficult
  1335.   to come by, since each dataset, proposed usage and system configuration
  1336.   differs from person to person.
  1337.  
  1338.   From the current author's point of view, if the dataset is relatively small,
  1339.   being tables of less than 1 million rows, and less than 1000 tables in a
  1340.   given database, then mSQL is a perfectly acceptable solution to your
  1341.   problem. This database is extremely cheap, is wonderfully robust and has
  1342.   excellent support. More information is available on the Hughes Technology
  1343.   WWW site at:
  1344.  
  1345.       http://www.hughes.com.au
  1346.  
  1347.   If the dataset is larger than 1 million row tables or 1000 tables, or if you
  1348.   have either more money, or larger machines, I would recommend Oracle7 RDBMS.
  1349.   Oracle's WWW site is an excellent source of more information.
  1350.  
  1351.       http://www.oracle.com
  1352.  
  1353.   Informix is another high-end RDBMS that is worth considering. There are
  1354.   several differences between Oracle and Informix which are too complex for
  1355.   this document to detail. Information on Informix can be found on their WWW
  1356.   site at:
  1357.  
  1358.       http://www.informix.com
  1359.  
  1360.   In the case of WWW fronted applications, mSQL may be a better option due to
  1361.   slow connection times between a CGI script and the Oracle RDBMS and also the
  1362.   amount of resource each Oracle connection will consume. mSQL is lighter
  1363.   resource-wise and faster.
  1364.  
  1365.   These views are not necessarily representative of anyone else's opinions,
  1366.   and do not reflect any corporate sponsorship or views. They are provided
  1367.   as-is.
  1368.  
  1369.   ----------------------------------------------------------------------------
  1370.  
  1371.   3.8 Is <insert feature here> supported in DBI?
  1372.  
  1373.   Given that we're making the assumption that the feature you have requested
  1374.   is a non-standard database-specific feature, then the answer will be no.
  1375.  
  1376.   DBI reflects a generic API that will work for most databases, and has no
  1377.   database-specific functionality.
  1378.  
  1379.   However, driver authors may, if they so desire, include hooks to
  1380.   database-specific functionality through the func method defined in the DBI
  1381.   API. Script developers should note that use of functionality provided via
  1382.   the func methods is unlikely to be portable across databases.
  1383.  
  1384.   ----------------------------------------------------------------------------
  1385.  
  1386.   Programming Questions
  1387.  
  1388.   ----------------------------------------------------------------------------
  1389.  
  1390.   4.1 Is DBI any use for CGI programming?
  1391.  
  1392.   In a word, yes! DBI is hugely useful for CGI programming! In fact, I would
  1393.   tentatively say that CGI programming is one of two top uses for DBI.
  1394.  
  1395.   DBI confers the ability to CGI programmers to power WWW-fronted databases to
  1396.   their users, which provides users with vast quantities of ordered data to
  1397.   play with. DBI also provides the possibility that, if a site is receiving
  1398.   far too much traffic than their database server can cope with, they can
  1399.   upgrade the database server behind the scenes with no alterations to the CGI
  1400.   scripts.
  1401.  
  1402.   ----------------------------------------------------------------------------
  1403.  
  1404.   4.2 How do I get faster connection times with DBD::Oracle and CGI?
  1405.  
  1406.       Contributed by John D. Groenveld
  1407.  
  1408.   The Apache httpd maintains a pool of httpd children to service client
  1409.   requests.
  1410.  
  1411.   Using the Apache mod_perl module by Doug MacEachern, the perl interpreter is
  1412.   embedded with the httpd children. The CGI, DBI, and your other favorite
  1413.   modules can be loaded at the startup of each child. These modules will not
  1414.   be reloaded unless changed on disk.
  1415.  
  1416.   For more information on Apache, see the Apache Project's WWW site:
  1417.  
  1418.       http://www.apache.org
  1419.  
  1420.   The mod_perl module can be downloaded from CPAN via:
  1421.  
  1422.       http://www.perl.com/cgi-bin/cpan_mod?module=mod_perl
  1423.  
  1424.   ----------------------------------------------------------------------------
  1425.  
  1426.   4.3 How do I get persistent connections with DBI and CGI?
  1427.  
  1428.       Contributed by John D. Groenveld
  1429.  
  1430.   Using Edmund Mergl's Apache::DBI module, database logins are stored in a
  1431.   hash with each of these httpd child. If your application is based on a
  1432.   single database user, this connection can be started with each child.
  1433.   Currently, database connections cannot be shared between httpd children.
  1434.  
  1435.   Apache::DBI can be downloaded from CPAN via:
  1436.  
  1437.       http://www.perl.com/cgi-bin/cpan_mod?module=Apache::DBI
  1438.  
  1439.   ----------------------------------------------------------------------------
  1440.  
  1441.   4.4 ``When I run a perl script from the command line, it works, but, when I
  1442.   run it under the httpd, it fails!'' Why?
  1443.  
  1444.   Basically, a good chance this is occurring is due to the fact that the user
  1445.   that you ran it from the command line as has a correctly configured set of
  1446.   environment variables, in the case of DBD::Oracle, variables like
  1447.   $ORACLE_HOME, $ORACLE_SID or TWO_TASK.
  1448.  
  1449.   The httpd process usually runs under the user id of nobody, which implies
  1450.   there is no configured environment. Any scripts attempting to execute in
  1451.   this situation will correctly fail.
  1452.  
  1453.   To solve this problem, set the environment for your database in a BEGIN ( )
  1454.   block at the top of your script. This will solve the problem.
  1455.  
  1456.   Similarly, you should check your httpd error logfile for any clues, as well
  1457.   as the ``Idiot's Guide To Solving Perl / CGI Problems'' and ``Perl CGI
  1458.   Programming FAQ'' for further information. It is unlikely the problem is
  1459.   DBI-related.
  1460.  
  1461.   The ``Idiot's Guide To Solving Perl / CGI Problems'' can be located at:
  1462.  
  1463.       http://www.perl.com/perl/faq/index.html
  1464.  
  1465.   as can the ``Perl CGI Programming FAQ''. Read BOTH these documents
  1466.   carefully!
  1467.  
  1468.   ----------------------------------------------------------------------------
  1469.  
  1470.   5.1 Can I do multi-threading with DBI?
  1471.  
  1472.   As of the current date of this FAQ ( see top of page ), no. perl does not
  1473.   support multi-threading. However, multi-threading is expected to become part
  1474.   of the perl core distribution as of version 5.005, which implies that DBI
  1475.   may support multi-threading fairly soon afterwards.
  1476.  
  1477.   For some OCI example code for Oracle that has multi-threaded SELECT
  1478.   statements, see:
  1479.  
  1480.       http://www.hermetica.com/technologia/oracle/oci/orathreads.tar.gz
  1481.  
  1482.   ----------------------------------------------------------------------------
  1483.  
  1484.   5.2 How do I handle BLOB data with DBI?
  1485.  
  1486.   To be written.
  1487.  
  1488.   ----------------------------------------------------------------------------
  1489.  
  1490.   5.3 How can I invoke stored procedures with DBI?
  1491.  
  1492.   Assuming that you have created a stored procedure within the target
  1493.   database, eg, an Oracle database, you can use $dbh->do to immediately
  1494.   execute the procedure. For example,
  1495.  
  1496.       $dbh->do( "BEGIN someProcedure END" );
  1497.  
  1498.   ----------------------------------------------------------------------------
  1499.  
  1500.   5.4 How can I get return values from stored procedures with DBI?
  1501.  
  1502.       Contributed by Jeff Urlwin
  1503.  
  1504.       $sth = $dbh->prepare( "BEGIN foo(:1, :2, :3); END;" );
  1505.       $sth->bind_param(1, $a);
  1506.       $sth->bind_param_inout(2, \$path, 2000);
  1507.       $sth->bind_param_inout(3, \$success, 2000);
  1508.       $sth->execute;
  1509.  
  1510.   Remember to perform error checking, though!
  1511.  
  1512.   ----------------------------------------------------------------------------
  1513.  
  1514.   5.5 How can I create or drop a database with DBI?
  1515.  
  1516.   Database creation and deletion are concepts that are entirely too abstract
  1517.   to be adequately supported by DBI. For example, Oracle does not support the
  1518.   concept of dropping a database at all! Also, in Oracle, the database server
  1519.   essentially is the database, whereas in mSQL, the server process runs
  1520.   happily without any databases created in it. The problem is too disparate to
  1521.   attack.
  1522.  
  1523.   Some drivers, therefore, support database creation and deletion through the
  1524.   private func methods. You should check the documentation for the drivers you
  1525.   are using to see if they support this mechanism.
  1526.  
  1527.   ----------------------------------------------------------------------------
  1528.  
  1529.   5.6 How can I commit or rollback a statement with DBI?
  1530.  
  1531.   To be written.
  1532.  
  1533.   ----------------------------------------------------------------------------
  1534.  
  1535.   5.7 How are NULL values handled by DBI?
  1536.  
  1537.   NULL values in DBI are specified to be treated as the value undef. NULLs can
  1538.   be inserted into databases as NULL, for example:
  1539.  
  1540.       $rv =
  1541.           $dbh->do( "INSERT INTO table VALUES( NULL )" );
  1542.  
  1543.   but when queried back, the NULLs should be tested against undef. This is
  1544.   standard across all drivers.
  1545.  
  1546.   ----------------------------------------------------------------------------
  1547.  
  1548.   5.8 What are these func methods all about?
  1549.  
  1550.   The func method is defined within DBI as being an entry point for
  1551.   database-specific functionality, eg, the ability to create or drop
  1552.   databases. Invoking these driver-specific methods is simple, for example, to
  1553.   invoke a createDatabase method that has one argument, we would write:
  1554.  
  1555.       $rv =
  1556.           $dbh->func( 'argument', 'createDatabase' );
  1557.  
  1558.   Software developers should note that the func methods are non-portable
  1559.   between databases.
  1560.  
  1561.   ----------------------------------------------------------------------------
  1562.  
  1563.   Support and Training
  1564.  
  1565.   The Perl5 Database Interface is FREE software. IT COMES WITHOUT WARRANTY OF
  1566.   ANY KIND.
  1567.  
  1568.   However, some organizations are providing either technical support or
  1569.   training programs on DBI. The present author has no knowledge as to the
  1570.   quality of these services. The links are included for reference purposes
  1571.   only.
  1572.  
  1573.   ----------------------------------------------------------------------------
  1574.  
  1575.   Commercial Support
  1576.  
  1577.   The Perl Clinic
  1578.        The Perl Clinic can arrange commercial support contracts for Perl, DBI,
  1579.        DBD::Oracle and Oraperl. Support is provided by the company with whom
  1580.        Tim Bunce, author of DBI, works. For more information on their
  1581.        services, please see:
  1582.  
  1583.            http://www.perl.co.uk/tpc
  1584.  
  1585.        for more details.
  1586.  
  1587.   ----------------------------------------------------------------------------
  1588.  
  1589.   Training
  1590.  
  1591.   No training programs are known at this time.
  1592.  
  1593.   ----------------------------------------------------------------------------
  1594.  
  1595.   Other References
  1596.  
  1597.   In this section, we present some miscellaneous WWW links that may be of some
  1598.   interest to DBI users. These are not verified and may result in unknown
  1599.   sites or missing documents.
  1600.  
  1601.       http://www-ccs.cs.umass.edu/db.html
  1602.       http://www.odmg.org/odmg93/updates_dbarry.html
  1603.       http://www.jcc.com/sql_stnd.html
  1604.  
  1605.   ----------------------------------------------------------------------------
  1606.  
  1607.   AUTHOR
  1608.  
  1609.   Alligator Descartes <descarte@hermetica.com>
  1610.  
  1611.   ----------------------------------------------------------------------------
  1612.   Reproduced here by permission from Alligator Descartes Hermetica
  1613.   ----------------------------------------------------------------------------
  1614.  
  1615.   13.  PostgreSQL Management Tools
  1616.  
  1617.   13.1.  PGACCESS - A GUI Tool for PostgreSQL Management
  1618.  
  1619.   It is already included in the distribution of PostgreSQL.  You may
  1620.   want to check out this web site for a newer copy
  1621.  
  1622.   ╖  <http://www.flex.ro/pgaccess>
  1623.  
  1624.   ╖  If you have any comment, suggestion for improvements, please feel
  1625.      free to e-mail to : teo@flex.ro
  1626.  
  1627.   This is what the home page of pgaccess says:
  1628.  
  1629.   PgAccess - a Tcl/Tk interface to PostgreSQL
  1630.  
  1631.   ---------------------------------------------------------------------------
  1632.   Latest version of PgAccess is 0.63 , 4 December 1997
  1633.  
  1634.   I think that there were some problems loading libpgtcl library.
  1635.   I invite you to read a special section concerning libpgtcl
  1636.  
  1637.   What does PgAccess now!
  1638.  
  1639.   Here are some images from PgAccess windows : Main window , table builder ,
  1640.   table(query) view , visual query builder .
  1641.  
  1642.   Tables
  1643.   - opening tables for viewing, max 200 records (changed by preferences menu)
  1644.  
  1645.   - column resizing, dragging the vertical grid line (better in table space
  1646.   rather than in the table header)
  1647.   - text wrap in cells - layout saved for every table
  1648.   - import/export to external files (SDF,CSV)
  1649.   - filter capabilities (enter filter like (price>3.14)
  1650.   - sort order capabilities (enter manually the sort field(s))
  1651.   - editing in place
  1652.   - improved table generator assistant
  1653.   - improved field editing
  1654.   Queries
  1655.   - define , edit and stores "user defined queries"
  1656.   - store queries as views
  1657.   - execution of queries
  1658.   - viewing of select type queries result
  1659.   - query deleting and renaming
  1660.   - NEW !!! Visual query builder with drag & drop capabilities. For any of
  1661.   you who had installed the Tcl/Tk plugin for Netscape Navigator, you can see
  1662.   it at work clicking here
  1663.   Sequences
  1664.   - defines sequences, delete them and inspect them
  1665.   Functions
  1666.   - define, inspect and delete functions in SQL language
  1667.  
  1668.   On the TODO list!
  1669.   - table design (add new fields, renaming, etc.)
  1670.   - function definition
  1671.   - report generator
  1672.   - basic scripting
  1673.  
  1674.   If you have any comment, suggestion for improvements, please feel free to
  1675.   e-mail to : teo@flex.ro
  1676.   ---------------------------------------------------------------------------
  1677.  
  1678.   More information about libgtcl
  1679.  
  1680.   Also, you will need the PostgreSQL to Tcl interface library, lined as a
  1681.   Tcl/Tk 'load'-able module. It is called libpgtcl and the source is located
  1682.   in the PostgreSQL directory /src/interfaces/libpgtcl. Specifically, you
  1683.   will need a libpgtcl library that is 'load'-able from Tcl/Tk. This is
  1684.   technically different from an ordinary PostgreSQL loadable object file,
  1685.   because libpgtcl is a collection of object files. Under Linux, this is
  1686.   called libpgtcl.so.
  1687.   You can download from here a version already compiled for Linux i386
  1688.   systems. Just copy libpgtcl.so into your system library director (/usr/lib)
  1689.   and go for it. One of the solutions is to remove from the source the line
  1690.   containing load libpgtcl.so and to load pgaccess.tcl not with wish, but
  1691.   with pgwish (or wishpg) that wish that was linked with libpgtcl library.
  1692.  
  1693.   However, the application should work without problems.
  1694.   13.2.  Windows Interactive Query Tool for PostgreSQL (WISQL or MPSQL)
  1695.  
  1696.   MPSQL provides users with a graphical SQL interface to PostgresSQL.
  1697.   MPSQL is similar to Oracle's SQL Worksheet and Microsoft SQL Server's
  1698.   query tool WISQL.  It has nice GUI and has history of commands. Also
  1699.   you can cut and paste and it has other nice features to improve your
  1700.   productivity.
  1701.  
  1702.   ╖  <http://www.troubador.com/~keidav/index.html>
  1703.  
  1704.   ╖  Email: keidav@whidbey.com
  1705.  
  1706.   ╖  <http://www.ucolick.org/~de/> in file tcl_syb/wisql.html
  1707.  
  1708.   ╖  <http://www.troubador.com/~keidav/index.html>
  1709.  
  1710.   ╖  Email: de@ucolick.org
  1711.  
  1712.   13.3.  Interactive Query Tool (ISQL) for PostgreSQL called PSQL
  1713.  
  1714.   ISQL is For Character command line terminals.  This is included in the
  1715.   distribution, and is called PSQL. Very similar to Sybase ISQL, Oracle
  1716.   SQLplus. At unix prompt give command 'psql' which will put you in
  1717.   psql> prompt.
  1718.  
  1719.        Type \h to see help of commands.
  1720.  
  1721.   Very user friendly and easy to use. Also very useful for shell script¡
  1722.   ing in Bourne, Korn and C-shells.
  1723.  
  1724.   13.4.  MPMGR - A Database Management Tool for PostgresSQL
  1725.  
  1726.   MPMGR will provide a graphical management interface for PostgresSQL.
  1727.   You can find it at
  1728.  
  1729.   ╖  <http://www.troubador.com/~keidav/index.html>
  1730.  
  1731.   ╖  Email: keidav@whidbey.com
  1732.  
  1733.   ╖  <http://www.ucolick.org/~de/> in file tcl_syb/wisql.html
  1734.  
  1735.   ╖  <http://www.troubador.com/~keidav/index.html>
  1736.  
  1737.   ╖  Email: de@ucolick.org
  1738.  
  1739.   14.  Setting up multi-boxes PostgreSQL with just one monitor
  1740.  
  1741.   You can stack up the cpu-boxes and connect to just one monitor and use
  1742.   the switch box to select the host. This saves space and you eliminate
  1743.   monitor(200 US dollars), keyboard(60 dollars) and the mouse(50
  1744.   dollars) and also avoid lot of clutter.
  1745.  
  1746.   Please check out these sites:
  1747.  
  1748.   ╖  Network Technologies Inc
  1749.      <http://www.networktechinc.com/servswt.html> (120 dollars/PC 8
  1750.      ports) which lists
  1751.  
  1752.   ╖  Scene Double Inc, England
  1753.      <http://www.scene.demon.co.uk/qswitch.htm>
  1754.  
  1755.   ╖  Cybex corporation  <http://www.cybex.com>
  1756.  
  1757.   ╖  Raritan Inc  <http://www.raritan.com>
  1758.  
  1759.   ╖  RealStar Solutions Inc  <http://www.real-star.com/kvm.htm>
  1760.  
  1761.   ╖  Belkin Inc  <http://www.belkin.com>
  1762.  
  1763.   ╖  DataComm Warehouse Inc Call 24 hours a day, 7 days a week at
  1764.      1-800-328-2261They supply all varieties of computer hardware
  1765.      <http://www.warehouse.com>
  1766.  
  1767.   ╖  Better Box Communications Ltd.
  1768.      <http://www.betterbox.com/info.html>
  1769.  
  1770.   ╖  Go to nearest hardware store and ask for "Server Switch" also known
  1771.      as "KVM Auto Switches".
  1772.  
  1773.   Search engine yahoo to find more companies with "Server Switches" or
  1774.   "KVM Switches".
  1775.  
  1776.   It is strongly recommended to have a dedicated unix box for each
  1777.   PostgreSQL server process for better performance. No other application
  1778.   program/processes should run on this box. See the Business section of
  1779.   your local newspapers for local vendors selling only intel box, 13"
  1780.   monochrome monitor (very low cost monitor). Local vendors sell just
  1781.   the hardware WITHOUT any Microsoft Windows/DOS (saves you about $
  1782.   150).  You do not need a color monitor for the database server, as you
  1783.   can do remote administration from color PC workstation. Get Redhat
  1784.   Linux cdrom from below -
  1785.  
  1786.   ╖  Linux System Labs Web site:   <http://www.lsl.com/>  7 (U.S.
  1787.      dollars)
  1788.  
  1789.   ╖  Cheap Bytes Inc Web site:   <http://www.cheapbytes.com/> 7 (U.S.
  1790.      dollars)
  1791.  
  1792.      Make sure that the hardware you purchase is supported by Redhat
  1793.      Linux. Check the ftp site of Redhat for recommended hardware like
  1794.      SCSI adapters, video cards before buying.  For just $ 600 you will
  1795.      get a powerful intel box with Redhat Linux running PostgreSQL.  Use
  1796.      odbc/jdbc/perl/tcl to connect to PostgreSQL from Windows95, OS/2,
  1797.      Unix Motif or Netscape browser (Netscape is very fast becoming the
  1798.      standard client).
  1799.  
  1800.   To stack up cpu boxes, buy $ 15 floor-to-ceiling shelf and clamp it to
  1801.   the wall with several bracket clamps.  Also bolt it down to floor. The
  1802.   size of the shelf is such that it just fits the computer. Place Intel
  1803.   boxes such that the side is butting against the wall and the front and
  1804.   rear (serial ports, network port, power connections) are easily
  1805.   accessible. Follow rules of Ergonomics, the shelf should have enough
  1806.   gap on both sides and there should be enough gap between many tower
  1807.   shelves.  Bundle the wires neatly. Put vertical steel strips so that
  1808.   boxes do not fall off during earth-quakes. Floor to ceiling shelf will
  1809.   fit about 30 Intel-Linux boxes.  Thus a small room can fit about 10
  1810.   tower shelves with 300 cpu boxes controlled by just one monitor and
  1811.   one keyboard!!
  1812.  
  1813.   Below is the extract from networktechnic Inc for the "Server Switches"
  1814.  
  1815.   Order now call 800-742-8324 (toll free in USA)
  1816.  
  1817.   To receive our catalog please Email your address to: sales@networktechinc.com
  1818.  
  1819.   CONTROL MULTIPLE PC'S with one keyboard monitor & mouse
  1820.   These electronic switches will allow one
  1821.   keyboard, monitor & mouse to control up to 64
  1822.   PC's. Embedded microcomputers simulate the
  1823.   presence of keyboard, monitor & mouse to all
  1824.   attached PC's 100% of the time.
  1825.  
  1826.   Features and Applications
  1827.  
  1828.   * Keyboard, front panel or remote control
  1829.   * 9 pin D Serial or 6 pin miniDIN mouse support
  1830.   * 5 pin DIN or 6 pin miniDIN keyboard support
  1831.   * 1600x1200 video resolution with no degradation
  1832.   * Uses standard cables
  1833.   * Desktop or rackmount
  1834.  
  1835.   Specifications - Keyboard
  1836.  
  1837.   * All connectors are female
  1838.   * 5 pin DIN or 6 pin miniDIN
  1839.   * Will hard or soft boot all PC's 100% of the time
  1840.  
  1841.   Controls - Buttons on Front
  1842.  
  1843.   * Touch a button and be connected to that PC
  1844.   * Hold any button in for more than 0.5 second and go into SCAN, BROADCAST or COMMAND mode
  1845.   * LEDs on front indicate mode of operation Keyboard
  1846.   * Type CTRL+* and go into COMMAND mode
  1847.   * SCAN, BROADCAST or COMMAND are available
  1848.  
  1849.   Mouse
  1850.  
  1851.   * 9 pin D serial
  1852.           o NTI switch emulates Microsoft serial mouse to all PC's
  1853.           o 9 pin D male for mouse
  1854.           o 9 pin D female for PC's
  1855.   * 6 pin miniDIN
  1856.           o NTI switch emulates IBM PS/2 style mouse to all PC's
  1857.           o All connectors are female
  1858.  
  1859.   Wired remote
  1860.  
  1861.   * Optional--must be purchased
  1862.   * Operates same as "Buttons on Front"
  1863.  
  1864.   Tech Info
  1865.  
  1866.   * Request technical manual MAN025
  1867.  
  1868.   Monitor-VGA
  1869.  
  1870.   * Bandwidth is 150 MHz
  1871.   * 1600X1200 resolution with no degradation
  1872.   * All connectors are female
  1873.  
  1874.   Power
  1875.  
  1876.   * 110 or 220 VAC at 50 or 60 Hz
  1877.  
  1878.   15.  Problem/Project Tracking System Application Tool for PostgreSQL
  1879.  
  1880.   This is at
  1881.  
  1882.   ╖  <http://www.homeport.org/~shevett/pts/>
  1883.  
  1884.   16.  Convert dbase dbf files to PostgreSQL
  1885.  
  1886.   The program dbf2msql works fine with mSQL and PostgreSQL. You can find
  1887.   it at
  1888.  
  1889.   ╖  <ftp://ftp.nerosworld.com/pub/SQL/dbf2sql/>
  1890.  
  1891.   ╖  <ftp://gopher.library.tudelft.nl/pub/misc/dbf2msql-0.4.tar.gz>
  1892.  
  1893.   ╖  <ftp://ftp.postgresql.org/pub/incoming/dbf2pg-3.0.tar.gz>
  1894.  
  1895.   This program was written by Maarten Boekhold, Faculty of Electrical
  1896.   Engineering TU Delft, NL Computer Architecture and Digital Technique
  1897.   section M.Boekhold@et.tudelft.nl
  1898.  
  1899.   You can also use a python method to read dbf files and load into a
  1900.   postgres database.
  1901.  
  1902.   ╖  See  <http://www.python.org>
  1903.  
  1904.   17.  PostgreSQL 4GL for web database applications - AppGEN Development
  1905.   System
  1906.  
  1907.   AppGEN can be downloaded from
  1908.  
  1909.   <http://www.man.ac.uk/~whaley/ag/appgen.html>
  1910.  
  1911.   <ftp://ftp.mcc.ac.uk/pub/linux/ALPHA/AppGEN>.
  1912.  
  1913.   Extract from the home page of AppGEN is given below:-
  1914.  
  1915.   AppGEN is a high level fourth generation language and application
  1916.   generator for producing World Wide Web (WWW) based applications. These
  1917.   applications are typically used over the internet or within a
  1918.   corporate intranet. AppGEN applications are implemented as C scripts
  1919.   conforming to the Common Gateway Interface (CGI) standard supported by
  1920.   most Web Servers.
  1921.  
  1922.   To use AppGEN you will need the following :-
  1923.  
  1924.   PostgresSQL, relational database management system
  1925.  
  1926.   A CGI compatible web server such as NCSA's HTTPD
  1927.  
  1928.   An ansi C compiler such as GCC
  1929.  
  1930.   AppGEN consists of the following Unix (Linux) executables :-
  1931.  
  1932.   ╖  defgen, which produces a basic template application from a logical
  1933.      data structure. The applications are capable of adding, updating,
  1934.      deleting and searching for records within the database whilst
  1935.      automatically maintaining referential integrity.
  1936.  
  1937.   ╖  appgen, the AppGEN compiler which compiles the appgen source code
  1938.      into CGI executable C source and HTML formatted documents ready for
  1939.      deployment on a web server.
  1940.  
  1941.   ╖  dbf2sql, a utility fo converting dBase III compatible .dbf files
  1942.      into executable SQL scripts. This enables data stored in most
  1943.      DOS/Windows based database packages to be migrated to a SQL server
  1944.      such as PostgresSQL.
  1945.  
  1946.   ╖  In addition, AppGEN comprises of a collection of HTML documents,
  1947.      GIF files and Java applets which are used at runtime by the system.
  1948.      And of course, like all good software, the full source code is
  1949.      included.
  1950.  
  1951.   The author, Andrew Whaley, can be contacted on
  1952.   andrew@arthur.smuht.nwest.nhs.uk and would appreciate any comments or
  1953.   suggestions about the software.
  1954.  
  1955.   18.  Web Database Design/Implementation tool for PostgreSQL - EARP
  1956.  
  1957.   <http://www.oswego.edu/Earp>
  1958.  
  1959.   <ftp://ftp.oswego.edu> in the directory 'pub/unix/earp'.
  1960.  
  1961.   The extract from the home page of EARP is given below:-
  1962.  
  1963.   The "Easily Adjustable Response Program" (EARP) created by David
  1964.   Dougherty
  1965.  
  1966.   18.1.  What is EARP ?
  1967.  
  1968.   EARP is a Web Database Design/Implementation tool, built on top of the
  1969.   PostgreSQL database system. Its functionality includes:
  1970.  
  1971.   ╖  A Visual Design System.
  1972.  
  1973.   ╖  A sendmail interface. (can handle incoming and outgoing mail)
  1974.  
  1975.   ╖  An Enhanced Security Mechanism.
  1976.  
  1977.   ╖  A cgi driver.
  1978.  
  1979.   18.2.  Implementation
  1980.  
  1981.   The main implementation of EARP is a CGI binary which runs under the
  1982.   http daemon to provide access to the database server. All of the
  1983.   design tools are built into the driver, no design takes place over
  1984.   anything but the web. The tools themselves require a graphical
  1985.   browser, the compatibility of objects designed with the tools is
  1986.   implementation independent, based on designing individuals
  1987.   preferences.
  1988.  
  1989.   18.3.  What you need to run EARP
  1990.  
  1991.   EARP will likely run on a variety of platforms with little or no
  1992.   porting. The known working platforms consist of the following:
  1993.  
  1994.   ╖  Solaris 2.5
  1995.  
  1996.   ╖  Linux 1.2.13+
  1997.  
  1998.   ╖  GNU C++
  1999.  
  2000.   ╖  PostgreSQL (Version 1.01 / 1.02 )
  2001.  
  2002.   ╖  netsite server
  2003.  
  2004.   ╖  NCSA httpd
  2005.  
  2006.   ╖  GNU C++
  2007.  
  2008.   ╖  PostgreSQL (Version 1.01 / 1.02 )
  2009.  
  2010.   ╖  NCSA httpd
  2011.  
  2012.   ╖  Apache httpd
  2013.  
  2014.   18.4.  News Flash
  2015.  
  2016.   The current (1.3) release of Earp was designed on top of the libpq
  2017.   release that came with PostgreSQL v1.01/1.02.  If you are using a more
  2018.   recent version of Postgres, expect that the program will require some
  2019.   porting to work correctly. In the development version (Earp 2.0),
  2020.   libpq support is being incorporated as a module, and thus will support
  2021.   as many versions of postgres as we have time to write the modules. The
  2022.   development release is expected to become public near mid-spring(97).
  2023.  
  2024.   18.5.  How does it work ?
  2025.  
  2026.   One of the main features of EARP is that it uses an Object Oriented
  2027.   approach to producing html pages which interface to the database. Most
  2028.   pages will consist of several objects. Each object is produced by some
  2029.   sort of tool and given a name, objects are then linked together in a
  2030.   callable sequence by the page tool. Objects are also reusable across
  2031.   multiple pages.  Basic tools exist for HTML, Querys, Grabbing input
  2032.   from forms, Extendable Formatting of Query and Input objects, and
  2033.   Linking together of objects into other objects. More advanced tools
  2034.   include the mail tool and the multithreaded query tool.
  2035.  
  2036.   Another feature of EARP is advanced security. Access to various areas
  2037.   of the EARP system can be limited in a variety of ways. To facilitate
  2038.   its advanced security, EARP performs checks for each connection to the
  2039.   system, determining what ids and groups the connecting agent belongs
  2040.   to. Access to areas is defined seperately, and the combination decides
  2041.   if access to a specific area of Earp is allowed. Moreover, all that is
  2042.   required to implement the security features is an http server that
  2043.   supports basic (or better) user authentication.
  2044.  
  2045.   18.6.  Some online examples
  2046.  
  2047.   As part of the ICC Help Database, the Catalog Search Page is an EARP
  2048.   document which runs several queries.  The selection boxes are
  2049.   generated by the EARP program from listings in the database.
  2050.  
  2051.   As another example of what can be done using EARP... now you can look
  2052.   at the List of Objects in the Help Database.
  2053.  
  2054.   Creating the three interfaces for the link took me less than 15
  2055.   minutes.
  2056.  
  2057.   18.7.  Where do I get it ?
  2058.  
  2059.   EARP is available via anonymous ftp from  <ftp://ftp.oswego.edu> in
  2060.   the directory 'pub/unix/earp'. The version as of this writing is 1.3.1
  2061.  
  2062.   Please, once you've retrieved EARP and gotten it to work, drop me a
  2063.   line and tell me your success or failure story.
  2064.  
  2065.   18.8.  Available Documentation
  2066.  
  2067.   All documentation has been moved to the User Docs and Tutorials index
  2068.   page.
  2069.  
  2070.   18.9.  A History of EARP
  2071.  
  2072.   Earp 0.1 began in Fall of 1995 as program I was working on to build a
  2073.   dynamically configurable web accessable guest book.  At that point it
  2074.   was a bunch of cgi programs that all did different but useful things
  2075.   and were held together with SSI glue, and a little sneaky c
  2076.   programming. What I soon realized though is that I was doing a lot of
  2077.   repetitive work, and that most of what I was doing had to be run in
  2078.   many windows at once (netscape, emacs, shell, mail) for it to make any
  2079.   sense, and that debugging was quickly becoming a nightmare. At that
  2080.   time I was also being approached by my friend and boss Don Michaels,
  2081.   who was interested in automating a large hunk of our user support, and
  2082.   keeping a historical database of requests and responses.
  2083.  
  2084.   Soon, I had worked out the initial scheme for what is now quickly
  2085.   becoming our help database, only I balked at the idea of building a
  2086.   help database with what was at that point a very primitive set of
  2087.   utilities. When spring classes were occurring(96) I started it anyway,
  2088.   mainly out of boredom, but also because I was in a database design
  2089.   class and a wanted to flex a few brain muscles. After a while I had a
  2090.   reasonable prototype up and running, which made Don very happy as he
  2091.   had basically given up on the idea of anyone every really creating a
  2092.   help database for him. (The prototype is still running on one of my
  2093.   servers...(june96)) The prototype did some very interesting things,
  2094.   but by april I was again getting discouraged... Everytime I wanted to
  2095.   change something, I had to go through a lengthy process of
  2096.   recompilation, or find an entry in a text file full of distractions.
  2097.   Also, there was no way for me to use the building block idea which is
  2098.   so useful in EARP... I did a lot of huge cutting and pasting. About
  2099.   the time that classes where ending I had again given up on the current
  2100.   scheme of things, and decided that what I needed was a better set of
  2101.   tools for what I was doing. Additionally, I also wanted to make my
  2102.   prototype work on top of a REAL relational database, and I wasn't
  2103.   cherishing the idea of reworking all those hard coded accesses, links,
  2104.   and output methods.
  2105.  
  2106.   I had a break for a short while, if you want to call it that. We
  2107.   sponsored the SUNY CIT Conference and I was so busy for about a week
  2108.   and a half that I got distanced from most of what I had written for
  2109.   the prototype help database, except the ideas I had had when I wrote
  2110.   the initial series of utilities, and what my biggest peeves were about
  2111.   the current state of things.
  2112.  
  2113.   Shortly after the conference, I began the prototype for the current
  2114.   version of EARP(may96), using the postgreSQL database as my relational
  2115.   backend. By the middle of June, the prototype had evolved into a
  2116.   fairly nice integrated suite of tool prototypes, with the primary
  2117.   advantage that they all ran over html, and stored their initialization
  2118.   information in the database. Most of the second half of june was spent
  2119.   debugging and working out the kinks in the code, and playing with the
  2120.   interface.( within those two weeks I accessed our web server over 5000
  2121.   times.) By the end of June I had most of the major bugs blasted out of
  2122.   EARP, and a large enough number of objects in the "new" help database
  2123.   to officially announce it to our help support staff.
  2124.  
  2125.   Incidentally, I also kept a journal during the development of EARP,
  2126.   and myself and Don Michaels are presenting a paper describing the Help
  2127.   Database at the Chicago ACM/SIGUCCS conference in September of this
  2128.   year.
  2129.  
  2130.   19.  WWW Web interface for PostgresSQL - DBENGINE
  2131.  
  2132.   <http://www.cis-computer.com/dbengine/ >
  2133.  
  2134.   dbengine a plug 'n play Web interface for PostgreSQL created by Ingo
  2135.   Ciechowski
  2136.  
  2137.   The extract from the home page of dbengine is given below:-
  2138.  
  2139.                                    dbengine
  2140.  
  2141.                               [CGI-Forum Webring]
  2142.  
  2143.                   a plug 'n play Web interface for Postgres95
  2144.  
  2145.   Version 0.82 alpha
  2146.   Documentation as of 08/11/97
  2147.   Written by Ingo Ciechowski
  2148.   ---------------------------------------------------------------------------
  2149.  
  2150.   About dbengine
  2151.  
  2152.   dbengine is an interface between the WWW and Postgres95 which provides
  2153.   simple access to any existing database within just a few minutes.
  2154.  
  2155.   This little Perl program was born after I've tried quite a lot of already
  2156.   available packages like AppGen, PHP-FI and more. So why did I kind of
  2157.   re-invent the wheel ?
  2158.  
  2159.   Well, PHP-FI gives you a Perl like language in your documents, but no real
  2160.   Perl while AppGen and wdb-p95 require that you create some configuration
  2161.   file for each of your databases -- sound's like you'll first of all have to
  2162.   learn some sort of new mata language before you can get started.
  2163.  
  2164.   That was the point when I started to feel more familiar with a small Perl
  2165.   applet of my own... and now my dbengine became a tool that I think at is
  2166.   ready to be shared with others.
  2167.  
  2168.   Unlike other tools you don't have to learn any special programming or
  2169.   scripting language to get started with dbengine. Also there's no
  2170.   configuration file for each database, so you don't have to get familiar
  2171.   with such a new structure.
  2172.   However - in case you want to gain access to the full features of dbengine
  2173.   it'd be a good idea to know the Perl language.
  2174.  
  2175.   The whole system can be configured by simple manipulations of an additional
  2176.   database that contains closer information about how to visualize your
  2177.   database access.
  2178.   You can even specify virtual Fields which are calculated on the fly right
  2179.   before they're displayed on the screen.
  2180.  
  2181.   Screenshots
  2182.  
  2183.      * Tablelist view with connected databases (104k)
  2184.      * Record view with related record list out of seperate table (100k)
  2185.  
  2186.   License
  2187.  
  2188.   dbengine is free software under the same terms as Perl. Read its licence if
  2189.   you aren't sure what you can or can't do. The bottom line is that this is a
  2190.   kinder and gentler version of the GNU licence -- one that doesn't infect
  2191.   your work if you care to borrow from dbengine or package up pieces of it as
  2192.   part of a commercial product!
  2193.  
  2194.   more information...
  2195.  
  2196.   If you're interested in closer information about dbengine, use these links:
  2197.  
  2198.      * how to install dbengine
  2199.      * how to configure the package
  2200.      * working with dbengine
  2201.      * description database
  2202.      * template files
  2203.  
  2204.   If you need any additional information, please feel free to send me an
  2205.   E-Mail .
  2206.   And of course there's still the well documented Perl source code that could
  2207.   help you to find your way ;-)
  2208.  
  2209.   ---------------------------------------------------------------------------
  2210.        last update of this page: 08/11/97
  2211.   ---------------------------------------------------------------------------
  2212.  
  2213.   20.  Apache Webserver Module for PostgreSQL - NeoSoft NeoWebScript
  2214.  
  2215.   Apache is a well-known Web Server. And a module to interface
  2216.   PostgreSQL to Apache Webserver is at -
  2217.   <http://www.neosoft.com/neowebscript/>
  2218.  
  2219.   The extract from the home page of NeoWebScript is given below:-
  2220.  
  2221.   NeoWebScript is a programming language that allows both simple and
  2222.   complex programs to be embedded into HTML files.
  2223.  
  2224.   When an HTML page containing embedded NeoWebScript is requested, the
  2225.   NeoWebScript-enabled webserver executes the embedded script(s),
  2226.   producing a webpage containing customized content created by the
  2227.   program.
  2228.  
  2229.   NeoWebScript is a fast, secure, easy to learn way to do powerful,
  2230.   server-based interactive programming directly in the HTML code in web
  2231.   pages. With NeoWebScript, counters, email forms, graffiti walls, guest
  2232.   books and visitor tracking are all easy, even for a beginning
  2233.   programmer. See how well NeoWebScript holds its' own vs. PERL and
  2234.   JavaScript.
  2235.  
  2236.   NeoWebScript 2.2 just released!  On June 24, 1997, NeoSoft released
  2237.   NeoWebScript 2.2, integrating it with the new Apache 1.2.0 server.
  2238.  
  2239.   If you're on a webserver that has NeoWebScript installed and you would
  2240.   like to started with it, we have a lot of User Info available.  Our
  2241.   New User FAQ has the basic answers to get you started. The Tutorials
  2242.   guide you through learning the language, while the Demos give you
  2243.   prebuilt applications you can download and modify.  Commands and
  2244.   Variables are the complete language references, and Troubleshooting
  2245.   contains hints and tips to help you get past any problems.
  2246.  
  2247.   If you'd like to install NeoWebScript on your webserver, your
  2248.   Webmaster needs to read our Sysop FAQ to get started. Theory of
  2249.   Operations will explain how NeoWebScript works, while installation
  2250.   will take them through the steps. Management deals with configuration
  2251.   issues and running the server, tests let you verify correct
  2252.   NeoWebScript operation, and troubleshooting deals with server
  2253.   problems.
  2254.  
  2255.   Hey, wait a minute you ask, how much do you want for all this great
  2256.   software, huh? There is no cost to you to use NeoWebScript-2.2 for
  2257.   your ISP, your intranet, or your extranet.  You'll see a full license
  2258.   when you register to download, but the gist is we'd like a whopping $
  2259.   99 if you want to embed it in your own product or use it in a commerce
  2260.   (eg. SSL) server.
  2261.  
  2262.   NeoWebScript is a module for the Apache webserver that allows you to
  2263.   embed the Tcl/Tk programming language in your webpages as a scripting
  2264.   tool. It was invented by Karl Lehenbauer, NeoSoft's Chief Technical
  2265.   Officer, and documented, enhanced and extended by NeoSoft's
  2266.   programmers and technical writers.
  2267.  
  2268.   The Apache webserver is the world's most popular webserver, accounting
  2269.   for 42 % of the 1,044,163 sites polled by the May 1997 Netcraft Web
  2270.   Server survey. The next largest entry were the various Microsoft
  2271.   servers, reporting in with slightly over 16 %, or a difference of over
  2272.   270,000 servers.
  2273.  
  2274.   Tcl/Tk is the powerful, free, cross-platform scripting language
  2275.   developed by Dr. John Ousterhout, now a Sun Distinguished Engineer. In
  2276.   his own words
  2277.  
  2278.   "Tcl/Tk lets software developers get the job done ten times faster
  2279.   than with toolkits based on C or C++. It's also a great glue language
  2280.   for making existing applications work together and making them more
  2281.   graphical and Internet-aware."
  2282.  
  2283.   With a developer community of over 500,000 worldwide, and thousands of
  2284.   commercial applications, Sun has just announced a new business group
  2285.   called SunScript, to support this community with an integrated
  2286.   development environment and to develop a suite of products to link Tcl
  2287.   to the Web and Java.
  2288.  
  2289.   Karl Lehenbauer, Founder and Chief Technical Officer of NeoSoft, has
  2290.   been part of Tcl/Tk development from the very beginning.  Together
  2291.   with Mark Diehkans, they authored Extended Tcl, also known as TclX or
  2292.   NeoSoft Tcl, a powerful set of extensions to the language. Many of the
  2293.   current core Tcl commands originated in Extended Tcl, and were then
  2294.   imported into the core language by Dr.  Ousterhout.
  2295.  
  2296.   NeoSoft Inc., 1770 St. James Place, Suite 500, Houston, TX 77056 USA
  2297.  
  2298.   21.  HEITML server side extension of HTML and a 4GL language for Post¡
  2299.   greSQL
  2300.  
  2301.   Tool heitml is another way to interface postgres with the world wide
  2302.   web.  For more details contact
  2303.  
  2304.                  Helmut Emmelmann H.E.I. Informationssyteme GmbH
  2305.                  Wimpfenerstrasse 23 Tel. 49-621-795141
  2306.                  68259 Mannheim Germany Fax. 49-621-795161
  2307.  
  2308.   ╖  E-mail Mr.Helmut Emmelmann at emmel@h-e-i.de
  2309.  
  2310.   ╖  Heitml main web site  <http://www.heitml.com>
  2311.  
  2312.   ╖  Heitml secondary web site  <http://www.h-e-i.deom>
  2313.  
  2314.   heitml is a server side extension of HTML and a 4GL language at the
  2315.   same time. People can write web applications in the HTML style by
  2316.   using new HTML-like tags.
  2317.  
  2318.   heitml (pronounced "Hi"-TML) is an extension of HTML and a full-
  2319.   featured 4th generation language that enables Web-based Applications
  2320.   to interact with data stored in SQL databases, without resorting to
  2321.   complex CGI scripts.
  2322.  
  2323.   heitml extends HTML on the sever side, dynamically converting ".hei"
  2324.   files to HTML format and so is compatible with any web browser.It
  2325.   embraces the familiar, easy-to-use HTML syntax and provides a large
  2326.   assortment of pre-developed Tags and Libraries to take care of tasks
  2327.   that formerly required CGI. As XML, heitml provides user defined tags.
  2328.   With heitml the user defined markup can be translated to HTML and send
  2329.   to a browser.
  2330.  
  2331.   heitml targets both HTML designers and professional programmers alike.
  2332.   HTML designers can use heitml Tags to build dynamic web pages, access
  2333.   SQL databases, or create complete web applications. Counters,
  2334.   registration databases, search forms, email forms, or hierarchical
  2335.   menues can all be created simply by using the pre-developed HTML-like
  2336.   Tags found in the many Component Libraries.
  2337.  
  2338.   For programmers heitml embeds a complete forth generation language in
  2339.   HTML
  2340.  
  2341.                  (e.g. <if>, <while>, and <let> Tags),
  2342.  
  2343.   plus powerful expression evaluation with integer, real, boolean,
  2344.   string, and tuple data types. Tuples have reference semantics as in
  2345.   modern object oriented languages and are stored on a heap. heitml
  2346.   variables including all complex data structures stored on the heap
  2347.   maintain their values between pages using the Session Mode. It is pos¡
  2348.   sible to define your own tags or environment tags and even re-define
  2349.   HTML-tags.
  2350.  
  2351.   heitml makes it possible to
  2352.  
  2353.   - - - develop Web Sites in a structured and modular way, drastically
  2354.   reducing maintenance overhead.
  2355.  
  2356.   - - - develop intelligent and interactive Web Sites, with content that
  2357.   dynamically adapts itself to user needs.
  2358.  
  2359.   - - - show the content of SQL databases with no programming other than
  2360.   to use our library of prefined "dba" Tags.
  2361.  
  2362.   - - - develop complex database and Catalog Shopping applications using
  2363.   Session Variables
  2364.  
  2365.   heitml runs on Linux with any Web Server using the CGI interface, and
  2366.   is especially fast (avoiding the CGI overhead) within the APACHE
  2367.   (version 1.1.1, 1.1.3, or 1.2.4) Web Server using the apache API.
  2368.   Currently MSQL (Version 1 and 2), PostgreSQL (Version 6), mysql, and
  2369.   the yard databases are supported). heitml also works on Linux, BSDi,
  2370.   Solaris and SunOS, as well as Windows NT with CGI and ISAPI and ODBC
  2371.   and Windows 95.
  2372.   heitml (on linux) is free for research, non-commercial and private
  2373.   usage. Commercial Web Sites must pay a licensing fee. The fully
  2374.   operational version of heitml is available for a trial period
  2375.   downloaded freely. (Note, however, that each ".hei" Web Page you
  2376.   develop will display a message identifying it as the version for non-
  2377.   commercial use. After registration, you will receive a key to switch
  2378.   off the message without having to re-install the program.)
  2379.  
  2380.   New features in version 1.2 are
  2381.  
  2382.   - - - Component Libraries for Database Search Forms, opening and
  2383.   closing hierachical menus, and email forms
  2384.  
  2385.   - - - Session Mode has been re-designed and enhanced to keep all
  2386.   variables (including the entire heap) between pages. This means data
  2387.   of any size can be kept within a session. This opens up the
  2388.   opportunity for a wider range of new applications, e.g. storing
  2389.   complete query results in session memory.
  2390.  
  2391.   - - - Installation instructions, documentation and example libraries
  2392.   have been significantly improved, a Tutorial has been added
  2393.  
  2394.   - - - Tags to execute shell commands and send emails have been added
  2395.  
  2396.   - - - Pretty Printing and debugging support. heitml shows your source
  2397.   code in color in your browser and marks errors in an intuitive way. In
  2398.   the case of runtime errors, all internal data structures are displayed
  2399.   in the browser marking and preserving the original source code
  2400.   positions.
  2401.  
  2402.   - - - Various new server variables and built-in functions have been
  2403.   added
  2404.  
  2405.   - - - In production mode heitml now collects complete information on
  2406.   errors that occurred while people were accessing your site.
  2407.  
  2408.   This is what the home page of the heitml says -
  2409.  
  2410.   heitml (pronounced "Hi"-TML) significantly extends and enhances the
  2411.   functionality of HTML by definable tags and full programming features.
  2412.   This makes dynamic content and database applications possible simply
  2413.   within the HTML world, without CGI and without external scripting or
  2414.   programming languages.  This means you, as an HTML author, can embed
  2415.   applications in your web pages, simply by using some new tags without
  2416.   CGI and without programming. As an advanced user or programmer on the
  2417.   other hand you can create and program powerful tag libraries. This
  2418.   approach makes heitml suitable for HTML newcomers and professional
  2419.   programmers alike.  heitml runs on the web server and dynamically
  2420.   generates HTML, so heitml is compatible with the internet standards
  2421.   and with any web browser. It allows full access to databases while
  2422.   shielding the user from any unneccessary CGI complexity. heitml has
  2423.   been developed according to the newst research and in compiler
  2424.   construction and transaction systems.
  2425.  
  2426.   heitml pages are developed just the same way as HTML pages, with a
  2427.   text editor or HTML editor, and placed on the web server as usual.
  2428.   However now pages can contain dynamic heitml tags and access tag
  2429.   libraries.  You can use these tags to access the database, to create
  2430.   dynamic content, to send emails, and even to create powerful
  2431.   applications like registration databases and shopping systems.
  2432.  
  2433.   HTML newcomers and professional programmers alike will be amazed at
  2434.   how quickly and easily they can design exciting applications like our
  2435.   Interactive Guestbook without resorting to complex and difficult to
  2436.   learn CGI scripts, simply by using the tools provided in our dba
  2437.   Library.
  2438.  
  2439.   heitml is accompanied by a wide range of tag libraries, to create
  2440.   guestbooks, database maintenance applications, extensible query forms,
  2441.   powerful email forms or structure your web site using a hierarchic
  2442.   menu. These tools are ready to go, just add the corresponding tags to
  2443.   your web site.
  2444.  
  2445.   As an experienced programmer you can make fully use of the heitml
  2446.   persistent dynamic tuple architecture : heitml is not just a scripting
  2447.   language with dynamic typing, full power expression evaluation,
  2448.   recursive procedures and extensive parameter passing features, but it
  2449.   also features persistent dynamic tuples to automatically keep session
  2450.   data of any size.
  2451.  
  2452.   heitml has so many features and uses it is impossible to describe it
  2453.   in a single Web Page. For that reason we have set up this Web Site in
  2454.   a manner that allows you to obtain a simple product "overview", or to
  2455.   delve as deeply as you want into the "nuts and bolts" of the language.
  2456.   Whichever manner you choose, we think you'll find that heitml has a
  2457.   lot to offer, and we hope you'll agree that it truly "takes the World
  2458.   Wide Web to a Higher Level!"
  2459.  
  2460.   The menu on the left-hand side of the screen will help you navigate
  2461.   our Web Site in an organized and methodical manner, but you can also
  2462.   use our Quick Menu to instantly jump to any page with a single mouse-
  2463.   click.
  2464.  
  2465.   If you're a first-time visitor to this Site, we suggest that you check
  2466.   out the heitml Interactive Guestbook for a truly impressive
  2467.   demonstration of how heitml can make your Web Pages more Interactive.
  2468.   If you sign our Guestbook, you can leave comments or tell us about
  2469.   your favorite Web Site using HTML formatting commands. It's like
  2470.   creating your own private Web Page and seeing it published
  2471.   immediately!
  2472.  
  2473.   The heitml Features section provides a Quick Summary of Features and
  2474.   Benefits, as well as Pages that are tailored to address the specific
  2475.   needs and questions of Designers and Programmers Our Language Guide
  2476.   provides an on-line tutorial that demonstrates in a practical manner
  2477.   some of the ways you can use heitml to develop, enhance and simplify
  2478.   your Web Pages and Applications.
  2479.  
  2480.   The Language Reference is for those looking for specific information
  2481.   regarding the syntax, structure and use of the various language
  2482.   elements. However, it would be a good idea for everyone to read the
  2483.   General Design page, which provides an overview of the specific kinds
  2484.   of problems heitml is designed to solve.
  2485.  
  2486.   Naturally, you'll want to know whether heitml runs on the specifc
  2487.   Operating System, Web Server, or SQL database software you're
  2488.   currently using, and you'll find all that information in our Supported
  2489.   Platforms section.
  2490.  
  2491.   Finally, we invite you to Download a trial copy of the program for use
  2492.   on your own system. We know you'll appreciate this "try before you buy
  2493.   policy", and we look forward to any feedback you'd like to give us.
  2494.  
  2495.   22.  PHP/FI Server-side html-embedded scripting language for Post¡
  2496.   greSQL
  2497.  
  2498.   WWW Interface Tool  <http://www.vex.net/php>
  2499.  
  2500.   Professional Home Pages (PHP)  <http://php.iquest.net/>
  2501.  
  2502.   Questions e-mail to : rasmus@lerdorf.on.ca
  2503.  
  2504.   The extract from the home page of PHP/FI is given below:-
  2505.  
  2506.   PHP/FI is a server-side html-embedded scripting language. It lets you
  2507.   write simple scripts right in your .HTML files much like JavaScript
  2508.   does, except, unlike JavaScript PHP/FI is not browser-dependant.
  2509.   JavaScript is a client-side html-embedded language while PHP/FI is a
  2510.   server-side language. PHP/FI is similar in concept to Netscape's
  2511.   LiveWire Pro product. If you have the money, you run Netscape's
  2512.   Commerce Server and you run one of the supported operating systems,
  2513.   you should probably have a look at LiveWire Pro. If you like free
  2514.   fast-moving software that comes with full source code you will
  2515.   probably like PHP/FI.
  2516.  
  2517.   22.1.  Major Features
  2518.  
  2519.   Standard CGI, FastCGI and Apache module Support As a standard CGI
  2520.   program, PHP/FI can be installed on any Unix machine running any Unix
  2521.   web server. With support for the new FastCGI standard, PHP/FI can take
  2522.   advantage of the speed improvements gained through this mechanism. As
  2523.   an Apache module, PHP/FI becomes an extremely powerful and lightning
  2524.   fast alternative to CGI programmimg.
  2525.  
  2526.   ╖  Access Logging With the access logging capabilities of PHP/FI,
  2527.      users can maintain their own hit counting and logging. It does not
  2528.      use the system's central access log files in any way, and it
  2529.      provides real-time access monitoring. The Log Viewer Script
  2530.      provides a quick summary of the accesses to a set of pages owned by
  2531.      an individual user. In addition to that, the package can be
  2532.      configured to generate a footer on every page which shows access
  2533.      information. See the bottom of this page for an example of this.
  2534.  
  2535.   ╖  Access Control A built-in web-based configuration screen handles
  2536.      access control configuration. It is possible to create rules for
  2537.      all or some web pages owned by a certain person which place various
  2538.      restrictions on who can view these pages and how they will be
  2539.      viewed. Pages can be password protected, completely restricted,
  2540.      logging disabled and more based on the client's domain, browser, e-
  2541.      mail address or even the referring document.
  2542.  
  2543.   ╖  Postgres Support Postgres is an advanced free RDBMS. PHP/FI
  2544.      supports embedding Postgres95 and PostgreSQL SQL queries directly
  2545.      in .html files.
  2546.  
  2547.   ╖  RFC-1867 File Upload Support File Upload is a new feature in
  2548.      Netscape 2.0. It lets users upload files to a web server. PHP/FI
  2549.      provides the actual Mime decoding to make this work and also
  2550.      provides the additional framework to do something useful with the
  2551.      uploaded file once it has been received.
  2552.  
  2553.   ╖  HTTP-based authentication control PHP/FI can be used to create
  2554.      customized HTTP-based authentication mechanisms for the Apache web
  2555.      server.
  2556.  
  2557.   ╖  Variables, Arrays, Associative Arrays PHP/FI supports typed
  2558.      variables, arrays and even Perl-like associative arrays. These can
  2559.      all be passed from one web page to another using either GET or POST
  2560.      method forms.
  2561.  
  2562.   ╖  Conditionals, While Loops PHP/FI supports a full-featured C-like
  2563.      scripting language.  You can have if/then/elseif/else/endif
  2564.      conditions as well as while loops and switch/case statements to
  2565.      guide the logical flow of how the html page should be displayed.
  2566.  
  2567.   ╖  Extended Regular Expressions Regular expressions are heavily used
  2568.      for pattern matching, pattern substitutions and general string
  2569.      manipulation. PHP/FI supports all common regular expression
  2570.      operations.
  2571.  
  2572.   ╖  Raw HTTP Header Control The ability to have web pages send
  2573.      customized raw HTTP headers based on some condition is essential
  2574.      for high-level web site design. A frequent use is to send a
  2575.      Location: URL header to redirect the calling client to some other
  2576.      URL. It can also be used to turn off cacheing or manipulate the
  2577.      last update header of pages.
  2578.  
  2579.   ╖  On-the-fly GIF image creation PHP/FI has support for Thomas
  2580.      Boutell's GD image library which makes it possible to generate GIF
  2581.      images on the fly.
  2582.  
  2583.   ╖  ISP "Safe Mode" support PHP/FI supports a unique "Safe Mode" which
  2584.      makes it safe to have multiple users run PHP scripts on the same
  2585.      server.
  2586.  
  2587.   ╖  It's Free!  One final essential feature. The package is completely
  2588.      free.  It is licensed under the GPL which allows you to use the
  2589.      software for any purpose, commercial or otherwise. See the GNU
  2590.      Public License document for complete details.
  2591.  
  2592.   22.2.  Credits
  2593.  
  2594.   * Large parts of this code were developed at and for the University of
  2595.   Toronto. Many thanks to Lee Oattes of the Network Development
  2596.   Department at the university for constant constructive criticism.
  2597.  
  2598.   * The PostgreSQL support code was written by Adam Sussman
  2599.   asussman@vidya.com
  2600.  
  2601.   * Countless others have helped test and debug the package.
  2602.  
  2603.   PHP/FI Version 2.0
  2604.  
  2605.   22.3.  Brief History
  2606.  
  2607.   PHP began life as a simple little cgi wrapper written in Perl. I wrote
  2608.   it in an afternoon during a period between contracts when I needed a
  2609.   quick tool to get an idea of who was reading my online resume. It was
  2610.   never intended to go beyond my own private use. The web server where I
  2611.   had my resume was extremely overloaded and had constant problems
  2612.   forking processes. I rewrote the Perl wrapper in C to get rid of the
  2613.   considerable overhead of having to fork Perl each time my resume was
  2614.   accessed.
  2615.  
  2616.   Eventually other people on the same web server came across my wrapper
  2617.   and asked if they could use it. Then, as inevitably happens, they
  2618.   started asking for more features. I added more features and finally
  2619.   put together a semi-complete distribution along with documentation, a
  2620.   mailing-list and a FAQ. The name of this first package was Personal
  2621.   Home Page Tools, which later became Personal Home Page Construction
  2622.   Kit.
  2623.  
  2624.   At the same time I started playing with databases and wrote a tool to
  2625.   easily embed SQL queries into web pages. It was basically another CGI
  2626.   wrapper that parsed SQL queries and made it easy to create forms and
  2627.   tables based on these queries. This tool was named FI (Form
  2628.   Interpreter).
  2629.  
  2630.   PHP/FI version 2.0 is a complete rewrite of these two packages
  2631.   combined into a single program. It has now evolved to the point where
  2632.   it is a simple programming language embedded inside HTML files. The
  2633.   original acronym, PHP, has stuck. It isn't really appropriate any
  2634.   longer. PHP/FI is used more for entire web sites today than for small
  2635.   Personal Home Page setups. By whatever name, it eliminates the need
  2636.   for numerous small Perl cgi programs by allowing you to place simple
  2637.   scripts directly in your HTML files. This speeds up the overall
  2638.   performance of your web pages since the overhead of forking Perl
  2639.   several times has been eliminated. It also makes it easier to manage
  2640.   large web sites by placing all components of a web page in a single
  2641.   html file. By including support for various databases, it also makes
  2642.   it trivial to develop database enabled web pages. Many people find the
  2643.   embedded nature much easier to deal with than trying to create
  2644.   separate HTML and CGI files.
  2645.  
  2646.   Throughout this documentation any references to PHP, FI or PHP/FI all
  2647.   refer to the same thing. The difference between PHP and FI is only a
  2648.   conceptual one. Both are built from the same source distribution. When
  2649.   I build the package without any access logging or access restriction
  2650.   support, I call my binary FI. When I build with these options, I call
  2651.   it PHP.
  2652.  
  2653.   22.4.  So, what can I do with PHP/FI ?
  2654.  
  2655.   The first thing you will notice if you run a page through PHP/FI is
  2656.   that it adds a footer with information about the number of times your
  2657.   page has been accessed (if you have compiled access logging into the
  2658.   binary). This is just a very small part of what PHP/FI can do for you.
  2659.   It serves another very important role as a form interpreter cgi, hence
  2660.   the FI part of the name. For example, if you create a form on one of
  2661.   your web pages, you need something to process the information on that
  2662.   form. Even if you just want to pass the information to another web
  2663.   page, you will have to have a cgi program do this for you. PHP/FI
  2664.   makes it extremely easy to take form data and do things with it.
  2665.  
  2666.   22.5.  A simple example
  2667.  
  2668.   Suppose you have a form:
  2669.  
  2670.        <FORM ACTION="/cgi-bin/php.cgi/~userid/display.html" METHOD=POST>
  2671.        <INPUT TYPE="text" name="name">
  2672.        <INPUT TYPE="text" name="age">
  2673.        <INPUT TYPE="submit">
  2674.        <FORM>
  2675.  
  2676.   Your display.html file could then contain something like:
  2677.  
  2678.   < ?echo "Hi $ name, you are $ age years old!
  2679.  
  2680.   " >
  2681.  
  2682.   It's that simple! PHP/FI automatically creates a variable for each
  2683.   form input field in your form. You can then use these variables in the
  2684.   ACTION URL file.
  2685.  
  2686.   The next step once you have figured out how to use variables is to
  2687.   start playing with some logical flow tags in your pages. For example,
  2688.   if you wanted to display different messages based on something the
  2689.   user inputs, you would use if/else logic. In our above example, we can
  2690.   display different things based on the age the user entered by changing
  2691.   our display.html to:
  2692.  
  2693.        <?
  2694.            if($age>50);
  2695.                echo "Hi $name, you are ancient!<p>";
  2696.            elseif($age>30);
  2697.                echo "Hi $name, you are very old!<p>";
  2698.            else;
  2699.                echo "Hi $name.";
  2700.            endif;
  2701.        >
  2702.  
  2703.   PHP/FI provides a very powerful scripting language which will do much
  2704.   more than what the above simple example demonstrates. See the section
  2705.   on the PHP/FI Script Language for more information.
  2706.  
  2707.   You can also use PHP/FI to configure who is allowed to access your
  2708.   pages.  This is done using a built-in configuration screen. With this
  2709.   you could for example specify that only people from certain domains
  2710.   would be allowed to see your pages, or you could create a rule which
  2711.   would password protect certain pages. See the Access Control section
  2712.   for more details.
  2713.  
  2714.   PHP/FI is also capable of receiving file uploads from any RFC-1867
  2715.   compliant web browser. This feature lets people upload both text and
  2716.   binary files. With PHP/FI's access control and logical functions, you
  2717.   have full control over who is allowed to upload and what is to be done
  2718.   with the file once it has been uploaded. See the File Upload section
  2719.   for more details.
  2720.  
  2721.   PHP/FI has support for the PostgreSQL database package. It supports
  2722.   embedded SQL queries in your .HTML files. See the section on
  2723.   PostgreSQL Support for more information.
  2724.  
  2725.   PHP/FI also has support for the mysql database package. It supports
  2726.   embedded SQL queries in your .HTML files. See the section on mysql
  2727.   Support for more information.
  2728.  
  2729.   22.6.  CGI Redirection
  2730.  
  2731.   Apache 1.0.x Notes
  2732.  
  2733.   A good way to run PHP/FI is by using a cgi redirection module with the
  2734.   Apache server. Please note that you do not need to worry about
  2735.   redirection modules if you are using the Apache module version of
  2736.   PHP/FI. There are two of these redirection modules available. One is
  2737.   developed by Dave Andersen angio@aros.net and it is available at
  2738.   ftp://ftp.aros.net/pub/util/apache/mod_cgi_redirect.c and the other
  2739.   comes bundled with Apache and is called mod_actions.c. The modules are
  2740.   extremely similar. They differ slightly in their usage. Both have been
  2741.   tested and both work with PHP/FI.
  2742.  
  2743.   One large caveat at the time of this writing (Apr.20/96) is that the
  2744.   current official Apache release (1.0.5) has a severe limitation which
  2745.   prevents cgi redirected requests from having any post-method data
  2746.   associated with them. I have tracked this down and fixed it in my
  2747.   version of Apache, and there is an official patch available in the
  2748.   File Archives on the PHP Home Page.
  2749.  
  2750.   A second rather large caveat with Apache 1.0.x is that it does not
  2751.   align double types correctly on most architectures. You find find
  2752.   yourself getting strange bus errors from your httpd when using
  2753.   mod_php, either upgrade to Apache 1.1 or edit the alloc.c Apache
  2754.   source file. In this file you will find the following piece of code:
  2755.  
  2756.   union align { /* Types which are likely to have the longest RELEVANT
  2757.   alignment * restrictions... we don't do much with doubles.  */
  2758.  
  2759.   char *cp; void (*f)(); long l; FILE *fp; };
  2760.  
  2761.   You will need to add a double to this line and recompile your Apache
  2762.   server. The correct block of code is:
  2763.  
  2764.   union align { /* Types which are likely to have the longest RELEVANT
  2765.   alignment * restrictions... we don't do much with doubles.  */
  2766.  
  2767.   char *cp; void (*f)(); long l; FILE *fp; double d; };
  2768.  
  2769.   Check the Apache documentation on how to add a module. Generally you
  2770.   add the module name to a file called Configuration. The line to be
  2771.   added if you want to use the mod_actions module is:
  2772.  
  2773.   Module action_module mod_actions.o
  2774.  
  2775.   If you are using the mod_cgi_redirect.c module add this line:
  2776.  
  2777.   Module cgi_redirect_module mod_cgi_redirect.o
  2778.  
  2779.   Then compile your httpd and install it. To configure the cgi
  2780.   redirection you need to either create a new mime type in your
  2781.   mime.types file or you can use the AddType command in your srm.conf
  2782.   file to add the mime type. The mime type to be added should be
  2783.   something like this:
  2784.  
  2785.   application/x-httpd-php phtml
  2786.  
  2787.   If you are using the mod_actions.c module you need to add the
  2788.   following line to your srm.conf file:
  2789.  
  2790.   Action application/x-httpd-php /cgi-bin/php.cgi
  2791.  
  2792.   If you are using mod_cgi_redirect.c you should add this line to
  2793.   srm.conf:
  2794.  
  2795.   CgiRedirect application/x-httpd-php /cgi-bin/php.cgi
  2796.  
  2797.   Don't try to use both mod_actions.c and mod_cgi_redirect.c at the same
  2798.   time.
  2799.  
  2800.   Once you have one of these cgi redirection modules installed and
  2801.   configured correctly, you will be able to specify that you want a file
  2802.   parsed by php/fi simply by making the file's extension .phtml.
  2803.   Furthermore, if you add index.phtml to your DirectoryIndex
  2804.   configuration line in your srm.conf file then the top-level page in a
  2805.   directory will be automatically parsed by php if your index file is
  2806.   called index.phtml.
  2807.   Netscape HTTPD
  2808.  
  2809.   You can automatically redirect requests for files with a given
  2810.   extension to be handled by PHP/FI by using the Netscape Server CGI
  2811.   Redirection module. This module is available in the File Archives on
  2812.   the PHP/FI Home Page. The README in the package explicitly explains
  2813.   how to configure it for use with PHP/FI.
  2814.  
  2815.   NCSA HTTPD
  2816.  
  2817.   NCSA does not currently support modules, so in order to do cgi
  2818.   redirection with this server you need to modify your server source
  2819.   code. A patch to do this with NCSA 1.5 is available in the PHP/FI file
  2820.   archives.
  2821.  
  2822.   22.7.  Running PHP/FI from the command line
  2823.  
  2824.   If you build the CGI version of PHP/FI, you can use it from the
  2825.   command line simply typing: php.cgi filename where filename is the
  2826.   file you want to parse. You can also create standalone PHP/FI scripts
  2827.   by making the first line of your script look something like:
  2828.  
  2829.            #!/usr/local/bin/php.cgi -q
  2830.  
  2831.   The "-q" suppresses the printing of the HTTP headers. You can leave
  2832.   off this option if you like.
  2833.  
  2834.   23.  Python Interface for PostgreSQL
  2835.  
  2836.   PyGres95 is a python interface for the PostgreSQL. See the readme file
  2837.   at <ftp://ftp.via.ecp.fr/pub/python/contrib/Database/PyGres95.README >
  2838.  
  2839.   Package is available from
  2840.   <ftp://ftp.via.ecp.fr/pub/python/contrib/Database/PyGres95-1.0b.tar.gz
  2841.   >
  2842.  
  2843.   The extract from the home page of PyGres95 is given below:-
  2844.  
  2845.   PyGres - v1.0b : PostgreSQL module for Python
  2846.  
  2847.   PyGres95, version 1.0b A Python interface for PostgreSQL database.
  2848.   Written by Pascal Andre, andre@chimay.via.ecp.fr
  2849.  
  2850.   PostgreSQL is a database system derived from Postgres4.2. It conforms
  2851.   to (most of) ANSI SQL and offer many interesting possibilities (C
  2852.   dynamic linking for functions or type definition, time travel, ...).
  2853.   This package is copyrighted by the Regents of the University of
  2854.   California, and is freely distributable.
  2855.  
  2856.   Python is a interpretated programming langage. It is object oriented,
  2857.   simple to use (light syntax, simple and straighforward statements),
  2858.   and has many extensions for building GUIs, interfacing with WWW, ...
  2859.   An "intelligent" web browser (HotJava like) is currently under
  2860.   development (november 1995), and this should open programmers many
  2861.   doors. Python is copyrighted by Stichting Mathematisch Centrum,
  2862.   Amsterdam, The Netherlands, and is freely distributable.
  2863.  
  2864.   PyGres95 is a python module that interfaces PostgreSQL database. It
  2865.   embeds PostgreSQL query library to allow an easy use of powerful
  2866.   PostgreSQL features cooperatively with all the other python modules.
  2867.   It has been developed on a Linux 1.3/ELF system, but have been tested
  2868.   on a Solaris 2.4 platform. Anyway, it should work on any platform
  2869.   where python and postgreSQL are available.
  2870.  
  2871.   23.1.  Where to get PyGres ?
  2872.  
  2873.   The home sites of the differents packages are:
  2874.  
  2875.   ╖  Python :      <ftp.python.org:/pub/python>
  2876.  
  2877.   ╖  PostgreSQL :  <ftp.s2k-ftp.cs.berkeley.edu:/pub/postgres95>
  2878.  
  2879.   ╖  PyGres95 :    <ftp.via.ecp.fr:/pub/python/contrib>
  2880.  
  2881.   You should anyway try to find some mirror site closer of your site.
  2882.   Refer to the information sources to find these sites. PyGres95 should
  2883.   reside in the contrib directories of Python and PostgreSQL sites.
  2884.  
  2885.   23.2.  Information and support
  2886.  
  2887.   If you need information about these packages please check their web
  2888.   sites:
  2889.  
  2890.   ╖  Python :      <http://www.python.org/>
  2891.  
  2892.   ╖  PostgreSQL :
  2893.      <http://epoch.cs.berkeley.edu:8000/postgres95/index.html>
  2894.  
  2895.   ╖  PyGres95 :    <http://www.via.ecp.fr/via/products/pygres.html>
  2896.  
  2897.   For support :
  2898.  
  2899.   ╖  Python :     newsgroup comp.lang.python
  2900.  
  2901.   ╖  PostgreSQL : mailing list (see package documentation for
  2902.      information)
  2903.  
  2904.   ╖  PyGres95 :   contact me andre@via.ecp.fr for bug reports, ideas,
  2905.      remarks
  2906.  
  2907.      I will try to answer as long as my free time allow me to do that.
  2908.  
  2909.   24.  Gateway between PostgreSQL and the WWW - WDB-P95
  2910.  
  2911.   WDB-P95 - A Web interface to PostgreSQL Databases.  It is at
  2912.   <http://www.eol.ists.ca/~dunlop/wdb-p95/>
  2913.  
  2914.   The extract from the home page of WDB-P95 is given below:-
  2915.  
  2916.   Version 1.4b2 beta - Created by J. Douglas Dunlop
  2917.  
  2918.   About wdb-p95
  2919.  
  2920.   This is a modified version of wdb-1.3a2 which provides a gateway to a
  2921.   the WWW for PostgreSQL. This version also requires a Browser that is
  2922.   capable of handling HTML Tables for the tabular output. This is not
  2923.   required by the original wdb and can be fairly easily reverted.  (I
  2924.   only wanted tables because the < pre > stuff just didn't agree with
  2925.   me!)
  2926.  
  2927.   You can try out my CASI Tape and Image Query. You can have a peek at
  2928.   the Form Definition File (FDF) that I used to create the CASI Tape and
  2929.   Image Query too, which includes a JOIN of 2 tables.
  2930.  
  2931.   This release contains all files necessary to install and run WDB-P95
  2932.   as an interface to your PostgreSQL databases. To port this system to
  2933.   other database should be relatively easy - provided that it supports
  2934.   standard SQL and has a Perl interface.
  2935.  
  2936.   24.1.  Does the PostgreSQL server,pgperl, and httpd have to be on the
  2937.   same host?
  2938.  
  2939.   No - the PostgreSQL server does not have to be on the same host. As
  2940.   WDB-P95 is called by the http daemon, they have to be on the same
  2941.   host. - And as WDB-P95 was written to use Pg.pm - pgperl has to be on
  2942.   the same host too.  Pgperl was written using the libpq library, so it
  2943.   will be able to access any PostgreSQL server anywhere in the net, just
  2944.   like any other PostgreSQL client. As illustrated below
  2945.  
  2946.   {WWW Client (Netscape)} => {HTTP Server (NCSA's http) + WDB-P95 +
  2947.   pgperl + libpq}=> {PostgreSQL server}
  2948.  
  2949.   Curly brackets () represent machines.
  2950.  
  2951.   Each machine can be of a different type : NT, SUN, HP, ... but you
  2952.   need the libpq interface library for the machine type where you plan
  2953.   to use WDB-P95, as you need it to compile pgperl. (The system was
  2954.   designed to use HTML tables so a recent WWW client is best)
  2955.  
  2956.   24.2.  New Version
  2957.  
  2958.   New versions of the software and the above pages are always available
  2959.   from the WDB-P95 Home page.  <http://www.eol.ists.ca/~dunlop/wdb-p95/>
  2960.  
  2961.   For questions or to join Mailing lists contact dunlop@eol.ists.ca
  2962.  
  2963.   25.  C" language Interface for PostgreSQL
  2964.  
  2965.   Included in distribution and is called 'libpq'. Similar to Oracle OCI,
  2966.   Sybase DB-lib, Informix CLI libraries.
  2967.  
  2968.   26.  C++" language Interface for PostgreSQL
  2969.  
  2970.   Included in distribution and is called 'libpq++'.
  2971.  
  2972.   27.  ESQL/C for PostgreSQL
  2973.  
  2974.   Embedded C Pre-compiler for PostgreSQL ESQL/C like Oracle Pro*C,
  2975.   Informix ESQL/C:
  2976.  
  2977.   ╖  <ftp://ftp.lysator.liu.se/pub/linus>
  2978.  
  2979.   ╖  Email : linus@epact.se
  2980.  
  2981.   The PostgreSQL ESQL/C is an SQL application-programming interface
  2982.   (API) enables the C programmer to create custom applications with
  2983.   database-management capabilities. The PostgreSQL ESQL/C allows you to
  2984.   use a third-generation language with which you are familiar and still
  2985.   take advantage of the Structured Query Language (SQL).
  2986.  
  2987.   ESQL/C consists of the following pieces of software:
  2988.  
  2989.   ╖  The ESQL/C libraries of C functions provide access to the database
  2990.      server.
  2991.  
  2992.   ╖  The ESQL/C header files provide definitions for the data
  2993.      structures, constants, and macros useful to the ESQL/C program.
  2994.  
  2995.   ╖  The ESQL/C preprocessor, is a source-code preprocessor that
  2996.      converts a C file containing SQL statements into an executable
  2997.      file.
  2998.  
  2999.   28.  BitWise Operators for PostgreSQL
  3000.  
  3001.   Bitwise operators was written by Nicolas Moldavsky nico@overnet.com.ar
  3002.  
  3003.   "C" functions that implement bitwise operators (AND, OR, XOR, bit
  3004.   complement) on pgsql. If anyone would like to use them, can get them
  3005.   by anonymous FTP from
  3006.  
  3007.   ╖  <ftp://ftp.overnet.com.ar/pub/utils/linux/bitpgsql.tgz>
  3008.  
  3009.   There included is a Makefile that works fine on Linux.
  3010.  
  3011.   29.  Japanese Kanji Code for PostgreSQL
  3012.  
  3013.   Very useful for Japanese people.  It is at the following site
  3014.   <ftp://ftp.sra.co.jp/pub/cmd/postgres/>
  3015.  
  3016.   30.  PostgreSQL Port to Windows 95/Windows NT
  3017.  
  3018.   Port to Windows 95/Windows NT is underway.  Porting is being done
  3019.   using gcc, gmake for Win NT/95. To compile source code on win32 gnu-
  3020.   win32 program is used.  GNU gcc is available for win32. Check this
  3021.   site -
  3022.  
  3023.   ╖  <http://www.cygnus.com/misc/gnu-win32>
  3024.  
  3025.      At this site and get the file cdk.exe (self-extractor file for gnu-
  3026.      win32)
  3027.  
  3028.   Porting can also be done using the following "Unix-Emulator on NT"
  3029.   tool from
  3030.  
  3031.   ╖  <http://www.softway.com>
  3032.  
  3033.   31.  Mailing Lists and Newsgroups
  3034.  
  3035.   31.1.  Newsgroups
  3036.  
  3037.   There is newsgroup for PostgreSQL at news.postgresql.org Please follow
  3038.   these steps to subscribe
  3039.  
  3040.        1. Choose Window | Netscape News
  3041.        2. Choose File | Open News Host
  3042.        3. Type news.postgresql.org in the edit box.
  3043.        4. The name of the newsgroup is comp.databases.postgresql.questions.
  3044.        To add right-click on news.postgresql.org, and choose Add Newsgroup.
  3045.        Then type the newsgroup into the edit box. The newsgroup will be added
  3046.        to the list in the left hand pane.
  3047.        5. Newsgroups will be listed in the left hand pane. Any messages in
  3048.        the selected newsgroup will appear in the right hand pane.
  3049.  
  3050.   31.2.  Get a Free e-mail account
  3051.  
  3052.   Check out the free deals offered - get free e-mail accounts from
  3053.  
  3054.   ╖  In Yahoo  <http://www.yahoo.com> click on e-mail
  3055.  
  3056.   ╖  In Lycos  <http://www.lycos.com> click on new e-mail accounts
  3057.  
  3058.   ╖  In hotmail  <http://www.hotmail.com> click on new e-mail accounts
  3059.  
  3060.      Subscribe to PostgreSQL mailing list and Yahoo has additional
  3061.      feature of creating a seperate folder for PostgreSQL e-mails, so
  3062.      that your regular e-mail is not cluttered. Select menu Email- >
  3063.      Options- > Filters and pick seperate folder for email.  With this
  3064.      e-mail account you can access mail from anywhere in the world as
  3065.      long as you have access to a web page.
  3066.  
  3067.   If you have any other e-mail, you can use "Mail Filters" to receive
  3068.   automatically the PostgreSQL mails into a seperate folder. This way it
  3069.   will be better organised and you avoid mail cluttering.
  3070.  
  3071.   31.3.  English Mailing List
  3072.  
  3073.   See the Mailing Lists Item on the main web page at :
  3074.   <http://www.postgresql.org/>
  3075.  
  3076.   ╖  Email questions to: pgsql-questions@postgresql.org
  3077.  
  3078.   ╖  Developers pgsql-hackers@postgresql.org
  3079.  
  3080.   ╖  Port specific questions pgsql-ports@postgresql.org
  3081.  
  3082.   ╖  Documentation questions pgsql-docs@postgresql.org
  3083.  
  3084.      You will get the answers/replies back by e-mail in less than a
  3085.      day!!
  3086.  
  3087.   You can also subscribe to mailing lists.  See also the section 'Get a
  3088.   Free e-mail account' above.  To subscribe or unsubscribe from the
  3089.   list, send mail to
  3090.  
  3091.   ╖  pgsql-questions-request@postgresql.org
  3092.  
  3093.   ╖  pgsql-hackers-request@postgresql.org
  3094.  
  3095.   ╖  pgsql-ports-request@postgresql.org
  3096.  
  3097.   ╖  pgsql-docs-request@postgresql.org
  3098.  
  3099.      The body of the message should contain the single line
  3100.  
  3101.   subscribe
  3102.  
  3103.   (or)
  3104.  
  3105.   unsubscribe
  3106.  
  3107.   31.4.  Archive of Mailing List
  3108.  
  3109.   Also mailing lists are archived in html format at the following
  3110.   location -
  3111.  
  3112.   ╖  <ftp://ftp.postgresql.org> directory is /pub/majordomo
  3113.  
  3114.   31.5.  Spanish Mailing List
  3115.  
  3116.   Now there is an "unofficial" list of postgreSQL in Spanish.  See also
  3117.   the section 'Free Account to Organise your PostgreSQL e-mails' above.
  3118.   To subscribe the user has to send a message to:
  3119.  
  3120.   ╖  majordomo@tlali.iztacala.unam.mx
  3121.  
  3122.      The body of the message should contain the single line:
  3123.  
  3124.   inscripcion pgsql-ayuda
  3125.  
  3126.   32.  Documentation and Reference Books
  3127.  
  3128.   32.1.  User Guides and Manuals
  3129.  
  3130.   The following are included in the PostgreSQL distribution in the
  3131.   postscript format and unix man-pages.  If you have access to internet,
  3132.   you can find the documents listed below at
  3133.   <http://www.postgresql.org/docs>
  3134.  
  3135.   ╖  "User Guide" for PostgreSQL
  3136.  
  3137.   ╖  "Implementation Guide" detailing database internals of PostgreSQL.
  3138.  
  3139.   ╖  Online manuals.
  3140.  
  3141.   ╖  Online manuals in HTML formats.
  3142.  
  3143.   ╖  Also manuals in Postscript format for printing hard copies.
  3144.  
  3145.   32.2.  Online Documentation
  3146.  
  3147.   ╖  Listing and description of default data types and operators
  3148.  
  3149.        Will be a part of PSQL command in the next release 6.3.  Already completed.
  3150.  
  3151.   ╖  Listing of supported SQL keywords
  3152.  
  3153.        There is a script in the /tools directory to do that
  3154.  
  3155.   ╖  Listings of supported statements -
  3156.  
  3157.        Use the command psql \h
  3158.  
  3159.   ╖  Basic relational database concepts under PostgreSQL
  3160.      (implementation) and Tons of online examples (queries) -
  3161.  
  3162.        Look at the regression tests at src/test. There you can find the directories
  3163.        regress/sql and suite/*.sql.
  3164.  
  3165.   ╖  Tutorial for PostgreSQL.
  3166.  
  3167.        SQL tutorial scripts is in the directory src/tutorial
  3168.  
  3169.   See also "SQL Tutorial for beginners" in Appendix C of this document
  3170.   ``''
  3171.  
  3172.   32.3.  Useful Reference Textbooks
  3173.  
  3174.   ╖  "Understanding the New SQL: A Complete Guide" - by Jim Melton and
  3175.      Alan R.Simon
  3176.  
  3177.        Morgan Kaufman Publisher is one of best SQL books. This deals with SQL92.
  3178.  
  3179.   ╖  "A Guide to THE SQL STANDARD" - by C.J.Date
  3180.  
  3181.        Addison-Wesley Publishing company is also a good book. Very popular book for SQL.
  3182.  
  3183.   ╖  SQL - The Standard Handbook,  November 1992
  3184.  
  3185.        Stephen Cannan and Gerard Otten
  3186.        McGraw-Hill Book Company Europe , Berkshire, SL6 2QL, England
  3187.  
  3188.   ╖  SQL Instant Reference, 1993
  3189.  
  3190.        Martin Gruber, Technical Editor: Joe Celko
  3191.        SYBEX Inc.  2021 Challenger Drive Alameda, CA 94501
  3192.  
  3193.   ╖  C.J.Date, "An introduction to Database Systems" (6th Edition),
  3194.      Addison-Wesley, 1995, ISBN 0-201-82458-2
  3195.  
  3196.        This book is the Bible of Database Management Systems.
  3197.        The book details normalization, SQL, recovery, concurrency, security,
  3198.        integrity, and extensions to the original relational model, current issues
  3199.        like client/server systems and the Object Oriented model(s). Many
  3200.        references are included for further reading. Recommended for most users.
  3201.  
  3202.   ╖  Stefan Stanczyk, "Theory and Practice of Relational Databases", UCL
  3203.      Press Ltd, 1990, ISBN 1-857-28232-9
  3204.  
  3205.        Book details theory of relational databases, relational algebra, calculus
  3206.        and normalisation. But it does not cover real world issues and examples
  3207.        beyond simple examples. Recommended for most users.
  3208.  
  3209.   ╖  "The Practical SQL Handbook" Third Edition, Addison Wesley
  3210.      Developers Press ISBN 0-201-44787-8
  3211.  
  3212.        Recommended for most users.
  3213.  
  3214.   ╖  Michael Stonebraker, "Readings in Database Systems", Morgan
  3215.      Kaufmann, 1988, ISBN 0-934613-65-6
  3216.  
  3217.        This book is a collection of papers that have been published over the
  3218.        years on databases. It's not for the casual user but it is really a
  3219.        reference for advanced (post-graduate) students or database system
  3220.        developers.
  3221.  
  3222.   ╖  C.J.Date, "Relational Database - Selected Readings", Addison-
  3223.      Wesley, 1986, ISBN 0-201-14196-5
  3224.  
  3225.        This book is a collection of papers that have been published over the
  3226.        years on databases. It's not for the casual user but it is really a
  3227.        reference for advanced (post-graduate) students or database system
  3228.        developers.
  3229.  
  3230.   ╖  Nick Ryan and Dan Smith, "Database Systems Engineering",
  3231.      International Thomson Computer Press, 1995, ISBN 1-85032-115-9
  3232.  
  3233.        This book goes into the details of access methods, storage techniques.
  3234.  
  3235.   ╖  Bipin C. Desai, "An introduction to Database Systems", West
  3236.      Publishing Co., 1990, ISBN 0-314-66771-7
  3237.  
  3238.        It's not for the casual user but it is for advanced (post-graduate)
  3239.        students or database system developers.
  3240.  
  3241.   ╖  Joe Celko "INSTANT SQL Programming"
  3242.  
  3243.        Wrox Press Ltd.
  3244.        Unit 16, 20 James Road, Tyseley
  3245.        Birmingham, B11 2BA, England
  3246.        1995
  3247.  
  3248.   ╖  Michael Gorman "Database Management Systems: Understanding and
  3249.      Applying Database"
  3250.  
  3251.   Technology
  3252.   QED and John Wiley
  3253.   1991
  3254.  
  3255.   ╖  Michael Gorman "Enterprise Database for a Client/Server
  3256.      Environment" QED and John Wiley
  3257.  
  3258.        Presents the requirements of building client/server database
  3259.        applications via repository metamodels and the use of ANSI standard SQL
  3260.        1993
  3261.  
  3262.   Hundreds of other titles on SQL are available! Check out a bookstore.
  3263.  
  3264.   32.4.  ANSI/ISO SQL Specifications documents  - SQL 1992, SQL 1998
  3265.  
  3266.   ANSI/ISO SQL specifications documents can be found at these sites
  3267.   listed below -
  3268.  
  3269.   ╖  <http://www.naiua.org/std-orgs.html>
  3270.  
  3271.   ╖  <http://www.ansi.org/docs> and click on file cat_c.html and search
  3272.      with "Database SQL"
  3273.  
  3274.   ╖  SQL92 standard  <http://www.jcc.com> and click on file
  3275.      sql_stnd.html
  3276.  
  3277.   ╖  ANSI/ISO SQL specifications
  3278.      <http://www.contrib.andrew.cmu.edu/~shadow/sql.html> You will find
  3279.      SQL Reference here.
  3280.  
  3281.   32.5.  Syntax of ANSI/ISO SQL 1992
  3282.  
  3283.   See Appendix A of this document ``''
  3284.  
  3285.   32.6.  Syntax of ANSI/ISO SQL 1998
  3286.  
  3287.   See Appendix B of this document ``''
  3288.  
  3289.   32.7.  SQL Tutorial for beginners
  3290.  
  3291.   See Appendix C of this document ``''
  3292.  
  3293.   32.8.  Temporal Extension to SQL92
  3294.  
  3295.   ╖  Document for Temporal Extension to SQL-92
  3296.      <ftp://FTP.cs.arizona.edu/tsql/tsql2/>
  3297.  
  3298.   ╖  Temporal SQL-3 specification
  3299.      <ftp://FTP.cs.arizona.edu/tsql/tsql2/sql3/>
  3300.  
  3301.   This directory contains the language specification for a temporal
  3302.   extension to the SQL-92 language standard. This new language is
  3303.   designated TSQL2.
  3304.  
  3305.   The language specification present here is the final version of the
  3306.   language.
  3307.  
  3308.   Correspondence may be directed to the chair of the TSQL2 Language
  3309.   Design Committee, Richard T.Snodgrass, Department of Computer Science,
  3310.   University of Arizona, Tucson, AZ 85721, rts@cs.arizona.edu .  The
  3311.   affiliations and e-mail addresses of the TSQL2 Language Design
  3312.   Committee members may be found in a separate section at the end of the
  3313.   language specification.
  3314.  
  3315.   The contents of this directory are as follows.
  3316.  
  3317.   spec.dvi,.ps    TSQL2 Language Specification, published in September,
  3318.   1994
  3319.  
  3320.   bookspec.ps     TSQL2 Language Specification, as it appears in the
  3321.   TSQL2 book, published in September, 1995 (see below).
  3322.  
  3323.   sql3            change proposals submitted to the ANSI and ISO SQL3
  3324.   committees.
  3325.  
  3326.   Associated with the language specification is a collection of
  3327.   commentaries which discuss design decisions, provide examples, and
  3328.   consider how the language may be implemented. These commentaries were
  3329.   originally proposals to the TSQL2 Language Design Committee. They now
  3330.   serve a different purpose: to provide examples of the constructs,
  3331.   motivate the many decisions made during the language design, and
  3332.   compare TSQL2 with the many other language proposals that have been
  3333.   made over the last fifteen years. It should be emphasized that these
  3334.   commentaries are not part of the TSQL2 language specification per se,
  3335.   but rather supplement and elaborate upon it. The language
  3336.   specification proper is the final word on TSQL2.
  3337.  
  3338.   The commentaries, along with the language specification, several
  3339.   indexes, and other supporting material, has been published as a book:
  3340.  
  3341.   Snodgrass, R.T., editor, The TSQL2 Temporal Query Language, Kluwer
  3342.   Academic Publishers, 1995, 674+xxiv pages.
  3343.  
  3344.   The evaluation commentary appears in the book in an abbreviated form;
  3345.   the full commentary is provided in this directory as file eval.ps
  3346.  
  3347.   The file tl2tsql2.pl is a prolog program that tranlates allowed
  3348.   temporal logic to TSQL2. This program was written by Michael Boehlen
  3349.   boehlen@iesd.auc.dk He may be contacted for a paper that describes
  3350.   this translation. This is a rather dated version of that program.
  3351.   Newer versions are available at
  3352.   <http://www.cs.auc.dk/general/DBS/tdb/TimeCenter/Software> (the TimeDB
  3353.   and Tiger systems).
  3354.  
  3355.   32.9.  Part 0 - Acquiring ISO/ANSI SQL Documents
  3356.  
  3357.     This document shows you how to (legally) acquire a copy
  3358.     of the SQL-92 standard and how to acquire a copy of the "current" SQL3
  3359.     Working Draft.
  3360.  
  3361.     The standard is copyrighted ANSI standard by ANSI, the ISO standard by ISO.
  3362.  
  3363.     There are two (2) current SQL standards, an ANSI publication
  3364.     and an ISO publication. The two standards are word-for-word identical
  3365.     except for such trivial matters as the title of the document, page
  3366.     headers, the phrase "International Standard" vs "American Standard", and
  3367.     so forth.
  3368.  
  3369.                       Buying the SQL-92 Standard
  3370.  
  3371.     The ISO standard, ISO/IEC 9075:1992, Information Technology - Database
  3372.     Languages - SQL, is currently (March, 1993) available and in stock from
  3373.     ANSI at:
  3374.  
  3375.        American National Standards Institute
  3376.        1430 Broadway
  3377.        New York, NY 10018 (USA)
  3378.        Phone (sales): +1.212.642.4900
  3379.  
  3380.     at a cost of US$230.00. The ANSI version, ANSI X3.135-1992, American
  3381.     National Standard for Information Systems - Database Language SQL, was
  3382.     not available from stock at this writing, but was expected to be
  3383.     available by some time between late March and early May, 1993). It is
  3384.     expected to be be priced at US$225.00.
  3385.  
  3386.     If you purchase either document from ANSI, it will have a handling
  3387.     charge of 7% added to it (that is, about US$9.10). Overseas shipping
  3388.     charges will undoubtedly add still more cost. ANSI requires a hardcopy
  3389.     of a company purchase order to accompany all orders; alternately, you
  3390.     can send a check drawn on a US bank in US dollars, which they will cash
  3391.     and clear before shipping your order. (An exception exists: If your
  3392.     organization is a corporate member of ANSI, then ANSI will ship the
  3393.     documents and simply bill your company.)
  3394.  
  3395.     The ISO standard is also available outside the United States from local
  3396.     national bodies (country standardization bodies) that are members of
  3397.     either ISO (International Organization for Standardization) or IEC
  3398.     (International Electrotechnical Commission). Copies of the list of
  3399.     national bodies and their addresses are available from ANSI or from
  3400.     other national bodies. They are also available from ISO:
  3401.  
  3402.        International Organization for Standardization
  3403.        Central Secretariat
  3404.        1, rue de Varembi
  3405.        CH-1211 Genhve 20
  3406.        Switzerland
  3407.  
  3408.     If you prefer to order the standard in a more convenient and quick
  3409.     fashion, you'll have to pay for the privilege. You can order ISO/IEC
  3410.     9075:1992, Information Technology - Database Languages - SQL, from:
  3411.  
  3412.        Global Engineering Documents
  3413.        2805 McGaw Ave
  3414.        Irvine, CA 92714 (USA)
  3415.        USA
  3416.        Phone (works from anywhere): +1.714.261.1455
  3417.        Phone (only in the USA): (800)854-7179
  3418.  
  3419.     for a cost of US$308.00. I do not know if that includes shipping or not,
  3420.     but I would guess that international shipping (at least) would cost
  3421.     extra. They will be able to ship you a document fairly quickly and will
  3422.     even accept "major credit cards". Global does not yet have the ANSI
  3423.     version nor do they have a price or an expected date (though I would
  3424.     expect it within a few weeks following the publication by ANSI and at a
  3425.     price near US$300.00).
  3426.  
  3427.                Buying a copy of the SQL3 Working Draft
  3428.     You can purchase a hardcopy of the SQL3 working draft from the ANSI X3
  3429.     Secretariat, CBEMA (Computer and Business Equipment Manufacturers
  3430.     Association). They intend to keep the "most recent" versions of the SQL3
  3431.     working draft available and sell them for about US$60.00 to US$65.00.
  3432.     You can contact CBEMA at:
  3433.  
  3434.        CBEMA, X3 Secretariat
  3435.        Attn: Lynn Barra
  3436.        1250 Eye St.
  3437.        Suite 200
  3438.        Washington, DC 20005 (USA)
  3439.  
  3440.     Lynn Barra can also be reached by telephone at +1.202.626.5738 to
  3441.     request a copy, though mail is probably more courteous.
  3442.  
  3443.              Electronic Access to the SQL3 Working Draft
  3444.     The most recent version (as of the date of this writing) of the SQL3
  3445.     (both ANSI and ISO) working draft (and all of its Parts) is available by
  3446.     "anonymous ftp" or by "ftpmail" on:
  3447.  
  3448.        gatekeeper.dec.com
  3449.  
  3450.     at
  3451.  
  3452.        /pub/standards/sql/
  3453.  
  3454.     In this directory are a number of files.  There are PostScript. files
  3455.     and "plain text" (not prettily formatted, but readable on a screen
  3456.     without special software).
  3457.  
  3458.     In general, you can find files with names like:
  3459.  
  3460.        sql-bindings-mar94.ps
  3461.        sql-bindings-mar94.txt
  3462.        sql-cli-mar94.ps
  3463.        sql-cli-mar94.txt
  3464.        sql-foundation-mar94.ps
  3465.        sql-foundation-mar94.txt
  3466.        sql-framework-mar94.ps
  3467.        sql-framework-mar94.txt
  3468.        sql-psm-mar94.ps
  3469.        sql-psm-mar94.txt
  3470.  
  3471.     As new versions of the documents are produced, the "mar94" will change
  3472.     to indicate the new date of publication (e.g., "aug94" is the expected
  3473.     date of the next publication after "mar94").
  3474.  
  3475.     In addition, for those readers unable to get a directory listing by FTP,
  3476.     we have placed a file with the name:
  3477.  
  3478.        ls
  3479.  
  3480.     into the same directory.  This file (surprise!) contains a directory
  3481.     listing of the directory.
  3482.  
  3483.                  Retrieving Files Directly Using ftp
  3484.  
  3485.     This is a sample of how to use FTP. Specifically, it shows how to
  3486.     connect to gatekeeper.dec.com, get to the directory where the base
  3487.     document is kept, and transfer the document to your host. Note that your
  3488.     host must have Internet access to do this. The login is 'ftp' and the
  3489.     password is your email address (this is sometimes referred to as
  3490.     'anonymous ftp'). The command 'type binary' is used to ensure that no
  3491.     bits are stripped from the file(s) received. 'get' gets one file at a
  3492.     time. Comments in the script below are inside angle brackets <like so>.
  3493.  
  3494.     % ftp gatekeeper.dec.com
  3495.     Connected to gatekeeper.dec.com.
  3496.     220- *** /etc/motd.ftp ***
  3497.          Gatekeeper.DEC.COM is an unsupported service of DEC Corporate Research.
  3498.          <...this goes on for a while...>
  3499.     220 gatekeeper.dec.com FTP server (Version 5.83 Sat ... 1992) ready.
  3500.     Name (gatekeeper.dec.com:<yourlogin here>): ftp  <anonymous also works>
  3501.     331 Guest login ok, send ident as password.
  3502.     Password: <enter your email address here >
  3503.     230 Guest login ok, access restrictions apply.
  3504.     Remote system type is UNIX.  <or whatever>
  3505.     Using binary mode to transfer files.
  3506.     ftp> cd pub/standards/sql
  3507.     250 CWD command successful.
  3508.     ftp> dir
  3509.     200 PORT command successful.
  3510.     150 Opening ASCII mode data connection for /bin/ls.
  3511.     total 9529
  3512.     -r--r--r--  1 root     system     357782 Feb 25 10:18 x3h2-93-081.ps
  3513.     -r--r--r--  1 root     system     158782 Feb 25 10:19 x3h2-93-081.txt
  3514.     -r--r--r--  1 root     system     195202 Feb 25 10:20 x3h2-93-082.ps
  3515.     -r--r--r--  1 root     system      90900 Feb 25 10:20 x3h2-93-082.txt
  3516.     -r--r--r--  1 root     system    5856284 Feb 25 09:55 x3h2-93-091.ps
  3517.     -r--r--r--  1 root     system    3043687 Feb 25 09:57 x3h2-93-091.txt
  3518.     226 Transfer complete.
  3519.     ftp> type binary
  3520.     200 Type set to I.
  3521.     ftp> get x3h2-93-082.txt
  3522.     200 PORT command successful.
  3523.     150 Opening BINARY mode data connection for x3h2-93-082.txt (90900 bytes).
  3524.     226 Transfer complete.
  3525.     90900 bytes received in 0.53 seconds (166.11 Kbytes/s)
  3526.     ftp> quit
  3527.     % <the file is now in your directory as x3h2-93-082.txt>
  3528.  
  3529.              Retrieving Files Without Direct ftp Support
  3530.     Digital Equipment Corporation, like several other companies, provides
  3531.     ftp email service. The response can take several days, but it does
  3532.     provide a service equivalent to ftp for those without direct Internet
  3533.     ftp access. The address of the server is:
  3534.  
  3535.        ftpmail@decwrl.dec.com
  3536.  
  3537.     The following script will retrieve the PostScript for the latest version
  3538.     of the SQL3 document:
  3539.  
  3540.        reply joe.programmer@imaginary-corp.com
  3541.        connect gatekeeper.dec.com anonymous
  3542.        binary
  3543.        compress
  3544.     The following script will retrieve the PostScript for the latest version
  3545.     of the SQL3 document:
  3546.  
  3547.        reply joe.programmer@imaginary-corp.com
  3548.        connect gatekeeper.dec.com anonymous
  3549.        binary
  3550.        compress
  3551.        uuencode
  3552.        chdir /pub/standards/sql
  3553.        get x3h2-93-091.ps
  3554.        quit
  3555.     The first line in the script commands the server to return the requested
  3556.     files to you; you should replace "joe.programmer@imaginary-corp.com"
  3557.     with your Internet address. The file in this example, x3h2-93-091.ps,
  3558.     is returned in "compress"ed "uuencode"d format as 34 separate email
  3559.     messages. If your environment does not provide tools for reconstructing
  3560.     such files, then you could retrieve the file as plain text with the
  3561.     following script:
  3562.  
  3563.        reply joe.programmer@imaginary-corp.com
  3564.        connect gatekeeper.dec.com anonymous
  3565.        chdir /pub/standards/sql
  3566.        get x3h2-93-091.ps
  3567.        quit
  3568.  
  3569.     But be warned, the .ps file will probably be sent to you in more than 70
  3570.     parts!
  3571.  
  3572.     To retrieve any particular file, other than x3h2-93-091.ps, simply
  3573.     replace "x3h2-93-091.ps" with the name of the desired file. To get a
  3574.     directory listing of all files available, replace "get x3h2-93-091.ps"
  3575.     with "dir".
  3576.  
  3577.   32.10.  Part 1 - ISO/ANSI SQL Current Status
  3578.  
  3579.   This chapter is a source of information about the SQL
  3580.   standards process and its current state.
  3581.  
  3582.   ----------------------------------------------------------------------------
  3583.   Current Status
  3584.  
  3585.   Development is currently underway to enhance SQL into a computationally
  3586.   complete language for the definition and management of persistent, complex
  3587.   objects. This includes: generalization and specialization hierarchies,
  3588.   multiple inheritance, user defined data types, triggers and assertions,
  3589.   support for knowledge based systems, recursive query expressions, and
  3590.   additional data administration tools. It also includes the specification of
  3591.   abstract data types (ADTs), object identifiers, methods, inheritance,
  3592.   polymorphism, encapsulation, and all of the other facilities normally
  3593.   associated with object data management.
  3594.  
  3595.   In the fall of 1996, several parts of SQL3 went through a ISO CD ballot.
  3596.   Those parts were SQL/Framework, SQL/Foundation, and SQL/Bindings. Those
  3597.   ballots failed (as expected) with 900 or so comments. In Late January, there
  3598.   was an ISO DBL editing meeting that processed a large number of problem
  3599.   solutions that were either included with ballot comments or submitted as
  3600.   separate papers. Since the DBL editing meeting was unable to process all of
  3601.   the comments, the editing meeting has been extended. The completion of the
  3602.   editing meeting is scheduled for the end of July, 1997, in London.
  3603.  
  3604.   Following the July editing meeting, the expectation is that a Final CD
  3605.   ballot will be requested for these parts of SQL. The Final CD process will
  3606.   take about 6 months and a DBL editing meeting, after which there will be a
  3607.   DIS ballot and a fairly quick IS ballot.
  3608.  
  3609.   The ISO procedures have changed since SQL/92, so the SQL committees are
  3610.   still working through the exact details of the process.
  3611.  
  3612.   If everything goes well, these parts of SQL3 will become an official ISO/IEC
  3613.   standard in late 1998, but the schedule is very tight.
  3614.  
  3615.   In 1993, the ANSI and ISO development committees decided to split future SQL
  3616.   development into a multi-part standard. The Parts are:
  3617.  
  3618.      * Part 1: Framework A non-technical description of how the document is
  3619.        structured.
  3620.      * Part 2: Foundation The core specification, including all of the new ADT
  3621.        features.
  3622.      * Part 3: SQL/CLI The Call Level Interface.
  3623.      * Part 4: SQL/PSM The stored procedures specification, including
  3624.        computational completeness.
  3625.      * Part 5: SQL/Bindings The Dynamic SQL and Embedded SQL bindings taken
  3626.        from SQL-92.
  3627.      * Part 6: SQL/XA An SQL specialization of the popular XA Interface
  3628.        developed by X/Open
  3629.      * Part 7:SQL/TemporalAdds time related capabilities to the SQL standards.
  3630.  
  3631.   In the USA, the entirety of SQL3 is being processed as both an ANSI Domestic
  3632.   ("D") project and as an ISO project. The expected time frame for completion
  3633.   of SQL3 is currently 1999.
  3634.  
  3635.   The SQL/CLI and SQL/PSM are being processed as fast as possible as addendums
  3636.   to SQL-92. In the USA, these are being processed only as International ("I")
  3637.   projects. SQL/CLI was completed in 1995. SQL/PSM should be completed
  3638.   sometime in late 1996.
  3639.  
  3640.   In addition to the SQL3 work, a number of additional projects are being
  3641.   persued:
  3642.  
  3643.      * SQL/MM An ongoing effort to define standard multi-media packages using
  3644.        the SQL3 ADT capabilities.
  3645.      * Remote Data Access (RDA)
  3646.  
  3647.   ----------------------------------------------------------------------------
  3648.  
  3649.   Standards Committee and Process
  3650.  
  3651.   There are actually a number of SQL standards committees around the world.
  3652.   There is an international SQL standards group as a part of ISO. A number of
  3653.   countries have committees that focus on SQL. These countries (usually) send
  3654.   representatives to ISO/IEC JTC1/SC 21/WG3 DBL meetings. The countries that
  3655.   actively participate in the ISO SQL standards process are:
  3656.  
  3657.      * Australia
  3658.      * Brazil
  3659.      * Canada
  3660.      * France
  3661.      * Germany
  3662.      * Japan
  3663.      * Korea
  3664.      * The Netherlands
  3665.      * United Kingdom
  3666.      * United States
  3667.  
  3668.   ----------------------------------------------------------------------------
  3669.  
  3670.   NIST Validation
  3671.  
  3672.   SQL implementations are validated (in the Unites States) by the National
  3673.   Institute of Standards and Testing (NIST). NIST currently has a validation
  3674.   test suite for entry level SQL-92. The exact details of the NIST validation
  3675.   requirements are defined as a Federal Information Processing Standard
  3676.   (FIPS). The current requirements for SQL are defined in FIPS 127-2. The
  3677.   Postscript and Text versions of this document can be retrieved from NIST.
  3678.   The current SQL Validated Products List can also be retrieved from NIST.
  3679.  
  3680.   ----------------------------------------------------------------------------
  3681.  
  3682.   Standard SQL Publications and Articles
  3683.  
  3684.   There are two versions of the SQL standard. Both are available from ANSI:
  3685.  
  3686.      * ISO/IEC 9075:1992, "Information Technology --- Database Languages ---
  3687.        SQL"
  3688.      * ANSI X3.135-1992, "Database Language SQL"
  3689.  
  3690.   The two versions of the SQL standard are identical except for the front
  3691.   matter and references to other standards. Both versions are available from:
  3692.  
  3693.      * American National Standards Institute
  3694.        1430 Broadway
  3695.        New York, NY 10018
  3696.        USA
  3697.        Phone (sales): +1.212.642.4900
  3698.  
  3699.   In additon to the SQL-92 standard, there is now a Technical Corrigendum (bug
  3700.   fixes):
  3701.  
  3702.      * Technical Corrigendum 1:1994 to ISO/IEC 9075:1992
  3703.  
  3704.   TC 1 should also be available from ANSI. There is only an ISO version of TC
  3705.   1 -- it applies both to the ISO and ANSI versions of SQL-92.
  3706.  
  3707.   In addition to the standards, several books have been written about the 1992
  3708.   SQL standard. These books provide a much more readable description of the
  3709.   standard than the actual standard.
  3710.  
  3711.   ----------------------------------------------------------------------------
  3712.  
  3713.   Related Standards
  3714.  
  3715.   A number of other standards are of interest to the SQL community. This
  3716.   section contains pointers to information on those efforts. These pointers
  3717.   will be augmented as additional information becomes available on the web.
  3718.  
  3719.      * SQL Environments (FIPS 193)
  3720.      * Next Generation Repository Systems (X3H4) - a News Release calling for
  3721.        particpation in "Developing Standards for the Next Generation
  3722.        Repository Systems."
  3723.   ----------------------------------------------------------------------------
  3724.  
  3725.   32.11.  Part 2 - ISO/ANSI SQL Foundation
  3726.  
  3727.        A significant portion of the SQL3 effort is in the SQL Foundation document:
  3728.  
  3729.           * Base SQL/PSM capabilities (moved form SQL/PSM-92)
  3730.           * New data types
  3731.           * Triggers
  3732.           * Subtables
  3733.           * Abstract Data Types (ADT)
  3734.           * Object Oriented Capabilities
  3735.  
  3736.        There are several prerequisites to the object oriented capabilities:
  3737.  
  3738.           * Capability of defining complex operations
  3739.           * Store complex operations in the database
  3740.           * External procedure calls ¡ Some operations may not be in SQL, or may
  3741.             require external interactions
  3742.  
  3743.        These capabilities are defined as a part of SQL/PSM
  3744.  
  3745.        A great deal of work is currently being done to refine the SQL-3 object
  3746.        model and align it with the object model proposed by ODMG. This effort is
  3747.        described in the X3H2 and ISO DBL paper: Accomodating SQL3 and ODMG. A
  3748.        recent update on the SQL3/OQL Merger is also available.
  3749.  
  3750.        SQL3 Timing
  3751.  
  3752.        Work on SQL3 is well underway, but the final standards is several years
  3753.        away.
  3754.  
  3755.           * International ballot to progress SQL3 Foundation from Working Draft to
  3756.             Committee Draft (CD) taking place fall, 1996.
  3757.           * Ballot is expected to generate numerous comments
  3758.           * A second CD ballot is likely to be required
  3759.           * Draft International Standard ballot is likely to be take place in mid
  3760.             1998
  3761.           * International Standard could be completed by mid 1999.
  3762.  
  3763.        The ANSI version of the standard will be on a similar schedule.
  3764.  
  3765.        ----------------------------------------------------------------------------
  3766.  
  3767.   32.12.  Part 3 - ISO/ANSI SQL Call Level Interface
  3768.  
  3769.        The SQL/CLI is a programing call level interface to SQL databases. It is
  3770.        designed to support database access from shrink-wrapped applications. The
  3771.        CLI was originally created by a subcommittee of the SQL Access Group (SAG).
  3772.        The SAG/CLI specification was published as the Microsoft Open DataBase
  3773.        Connectivity (ODBC) specification in 1992. In 1993, SAG submitted the CLI to
  3774.        the ANSI and ISO SQL committees. (The SQL Access Group has now merged with
  3775.        X/Open consortium.)
  3776.  
  3777.        SQL/CLI provides an international standard for:
  3778.  
  3779.           * Implementation-independent CLI to access SQL databases
  3780.           * Client-server tools can easily access database through dynamic Link
  3781.             Libraries
  3782.           * Supports and encourages rich set of Client-server tools
  3783.  
  3784.        SQL/CLI Timing
  3785.  
  3786.        For the standards process, SQL/CLI is being processed with blinding speed.
  3787.  
  3788.           * SQL/CLI is an addendum to 1992 SQL standard (SQL-92)
  3789.           * Completed as an ISO standard in 1995
  3790.           * ISO/IEC 9075-3:1995 Information technology -- Database languages -- SQL
  3791.             -- Part 3: Call-Level Interface (SQL/CLI)
  3792.           * Current SQL/CLI effort is adding support for SQL3 features
  3793.        ----------------------------------------------------------------------------
  3794.  
  3795.   32.13.  Part 4 - ISO/ANSI SQL Persistent Stored Modules
  3796.  
  3797.   SQL/PSM expands SQL by adding:
  3798.  
  3799.      * Procedural language extensions
  3800.      * Multi-statement and Stored Procedures
  3801.      * External function and procedure calls
  3802.  
  3803.   In addition to being a valuable application development tool, SQL/PSM
  3804.   provides the foundation support for the object oriented capabilities in
  3805.   SQL3.
  3806.  
  3807.   Multi-statement and Stored Procedures
  3808.  
  3809.   Multi-statement and stored procedures offer a variety of advantages in a
  3810.   client/server environment:
  3811.  
  3812.      * Performance - Since a stored procedure can perform multiple SQL
  3813.        statements, network interaction with the client are reduced.
  3814.      * Security - A user can be given the right to call a stored procedure
  3815.        that updates a table or set of tables but denied the right to update
  3816.        the tables directly
  3817.      * Shared code - The code in a stored procedure does not have to be
  3818.        rewritten and retested for each client tool that accesses the database.
  3819.      * Control - Provides a single point of definition and control for
  3820.        application logic.
  3821.  
  3822.   Procedural Language Extensions
  3823.  
  3824.   Procedural language add the power of a traditional programming language to
  3825.   SQL through flow control statements and a variety of other programming
  3826.   constructs.
  3827.  
  3828.   Flow Control Statements
  3829.  
  3830.      * If-then-else
  3831.      * Looping constructs
  3832.      * Exception handling
  3833.      * Case statement
  3834.      * Begin-End blocks
  3835.  
  3836.   The procedural language extensions include other programming language
  3837.   constructs:
  3838.  
  3839.      * Variable declarations
  3840.      * Set statements for value assignment
  3841.      * Get diagnostics for process and status information
  3842.  
  3843.   In addition, all of the traditional SQL statements can be included in
  3844.   multi-statement procedures.
  3845.  
  3846.   External Procedure and Function Calls
  3847.  
  3848.   One feature frequently mentioned in the wish lists for many database
  3849.   products, and implemented in some, is a capability augmenting the built-in
  3850.   features with calls to user-written procedures external to the database
  3851.   software.
  3852.  
  3853.      * Allows a particular site or application to add their own database
  3854.        functions
  3855.      * Can be used throughout the database applications
  3856.  
  3857.   The benefit of this capability is that it gives the database (and therefore
  3858.   database applications) access to a rich set of procedures and functions too
  3859.   numerous to be defined by a standards committee.
  3860.  
  3861.   SQL/PSM Timing
  3862.  
  3863.   SQL/PSM is proceeding quickly:
  3864.  
  3865.      * SQL/PSM is an addendum to SQL-92
  3866.      * International ballot to progress SQL/PSM from a Draft International
  3867.        Standard to an International Standard ended January, 1996.
  3868.      * Editing meeting in May, 1996 did not resolve all of the comments
  3869.      * Continuation of PSM Editing meeting is scheduled for September 30
  3870.        through October 4, 1996
  3871.      * The schedule is tight but there is a chance that PSM will be published
  3872.        with a 1996 date.
  3873.      * The official designation will be:
  3874.        ISO/IEC DIS 9075-4:199? Information technology -- Database languages --
  3875.        SQL -- Part 4: SQL Persistent Stored Modules (SQL/PSM)
  3876.      * Work is well underway on adding SQL/PSM support for SQL3 features.
  3877.  
  3878.   ----------------------------------------------------------------------------
  3879.  
  3880.   32.14.  Part 5 - ISO/ANSI SQL/Bindings
  3881.  
  3882.        For ease of reference, the programming language bindings have been pulled
  3883.        out into a separate document. The current version is simply an extract of
  3884.        the dynamic and embedded bindings from SQL-92.
  3885.  
  3886.        A variety of issues remain unresolved for the programming language bindings.
  3887.  
  3888.        For traditional programming language, mappings exist for the SQL-92
  3889.        datatypes. However, mappings must be defined between SQL objects and
  3890.        programming language variables.
  3891.  
  3892.        For object oriented languages, mapping must be defined for the current SQL
  3893.        datatypes and between the SQL object model and the object model of the
  3894.        object-oriented language.
  3895.  
  3896.        The object model needs to stabilize before these can be addressed.
  3897.  
  3898.        The language bindings will be completed as a part of SQL3.
  3899.  
  3900.        ----------------------------------------------------------------------------
  3901.  
  3902.   32.15.  Part 6 - ISO/ANSI SQL XA Interface Specialization (SQL/XA)
  3903.  
  3904.   This specification would standardize an application program interface (API)
  3905.   between a global Transaction Manager and an SQL Resource Manager. It would
  3906.   standardize the function calls, based upon the semantics of ISO/IEC 10026,
  3907.   "Distributed Transaction Processing", that an SQL Resource Manager would
  3908.   have to support for two-phase commit. The base document is derived from an
  3909.   X/Open publication, with X/Open permission, that specifies explicit input
  3910.   and output parameters and semantics, in terms of SQL data types, for the
  3911.   following functions: xa_close, xa_commit, xa_complete, xa_end, xa_forget,
  3912.   xa_open, xa_prepare, xa_recover, xa_rollback, and xa_start.
  3913.  
  3914.   ISO is currently attempting to fast-track the X/Open XA specification. The
  3915.   fast-track process adopts a current industry specification with no changes.
  3916.   The XA fast-track ballot at the ISO SC21, JTC 1 level started on April 27,
  3917.   1995 and ends on October 27, 1995. If the XA specification is approved by
  3918.   75% of the votes, and by 2/3 of the p-members of JTC 1, it will become an
  3919.   International Standard. If the fast-track ballot is approved, SQL/XA could
  3920.   become a standard in 1996.
  3921.   ----------------------------------------------------------------------------
  3922.  
  3923.   32.16.  Part 7 - ISO/ANSI SQL Temporal
  3924.  
  3925.   Temporal SQL deals with time-related data. The concept is that it is useful
  3926.   to query data to discover what it looked like at a particular point in time.
  3927.   Temporal SQL is a December, 1994 paper by Rick Snodgrass describing the
  3928.   concepts.
  3929.  
  3930.   X3 Announces the Approval of a New Project, ISO/IEC 9075 Part 7:
  3931.   SQL/Temporal is a press release related to SQL/Temporal.
  3932.  
  3933.   ----------------------------------------------------------------------------
  3934.                                   Temporal SQL
  3935.                                   ************
  3936.   Rick Snodgrass (chair of the TSQL2 committee)
  3937.   31-Dec-1994
  3938.  
  3939.   Several people have questioned the need for additional support for time in
  3940.   SQL3 (as proposed by DBL RIO-75, requesting a new part of SQL to support
  3941.   temporal databases). The claim is that abstract data types (ADT's) are
  3942.   sufficient for temporal support. In this informational item, I argue, using
  3943.   concrete examples, that using columns typed with abstract data types is
  3944.   inadequate for temporal queries. In particular, many common temporal queries
  3945.   are either difficult to simulate in SQL, or require embedding SQL in a
  3946.   procedural language. Alternatives are expressed in TSQL2, a temporal
  3947.   extension to SQL-92.
  3948.  
  3949.   1. INTRODUCTION
  3950.  
  3951.   Valid-time support goes beyond that of a temporal ADT. With the latter, a
  3952.   column is specified as of a temporal domain, such as DATE or INTERVAL
  3953.   (examples will be given shortly). With valid time, the rows of a table vary
  3954.   over time, as reality changes. The timestamp associated with a row of a
  3955.   valid-time table is interpreted by the query language as the time when the
  3956.   combination of values of the columns in the row was valid. This implicit
  3957.   timestamp allows queries to be expressed succinctly and intuitively.
  3958.  
  3959.   2. A CASE STUDY
  3960.  
  3961.   2.1 STORING CURRENT INFORMATION
  3962.  
  3963.   The University of Arizona's Office of Appointed Personnel has some
  3964.   information in a database, including each employee's name, their current
  3965.   salary, and their current title. This can be represented by a simple table.
  3966.  
  3967.           Employee(Name, Salary, Title)
  3968.  
  3969.   Given this table, finding an employee's salary is easy.
  3970.  
  3971.           SELECT Salary
  3972.  
  3973.           FROM Employee
  3974.  
  3975.           WHERE Name = 'Bob'
  3976.  
  3977.   Now the OAP wishes to record the date of birth. To do so, a column is added
  3978.   to the table, yielding the following schema.
  3979.  
  3980.           Employee(Name, Salary, Title, DateofBirth DATE)
  3981.  
  3982.   Finding the employee's date of birth is analogous to determining the salary.
  3983.  
  3984.           SELECT DateofBirth
  3985.  
  3986.           FROM Employee
  3987.  
  3988.           WHERE Name = 'Bob'
  3989.  
  3990.   2.2 STORING HISTORY INFORMATION
  3991.   The OAP wishes to computerize the employment history. To do so, they append
  3992.   two columns, one indicating when the information in the row became valid,
  3993.   the other indicating when the information was no longer valid.
  3994.  
  3995.   Employee (Name, Salary, Title, DateofBirth, Start DATE, Stop DATE)
  3996.  
  3997.   To the data model, these new columns are identical to DateofBirth. However,
  3998.   their presence has wide-ranging consequences.
  3999.  
  4000.   2.3 PROJECTION
  4001.  
  4002.   To find an employee's current salary, things are more difficult.
  4003.  
  4004.           SELECT Salary
  4005.  
  4006.           FROM Employee
  4007.  
  4008.           WHERE Name = 'Bob' AND Start <= CURRENT_DATE AND CURRENT_DATE <= Stop
  4009.  
  4010.   This query is more complicated than the previous one. The culprit is
  4011.   obviously the two new columns. The OAP wants to distribute to each employee
  4012.   their salary history. Specifically, for each person, the maximal intervals
  4013.   at each salary needs to be determined. Unfortunately, this is not possible
  4014.   in SQL. An employee could have arbitrarily many title changes between salary
  4015.   changes.
  4016.  
  4017.   Name    Salary  Title             DateofBirth   Start           Stop
  4018.  
  4019.   ----    ------  -----             -----------   -----           ----
  4020.  
  4021.   Bob     60000   Assistant Provost 1945-04-09    1993-01-01      1993-05-30
  4022.  
  4023.   Bob     70000   Assistant Provost 1945-04-09    1993-06-01      1993-09-30
  4024.  
  4025.   Bob     70000   Provost           1945-04-09    1993-10-01      1994-01-31
  4026.  
  4027.   Bob     70000   Professor         1945-04-09    1994-02-01      1994-12-31
  4028.  
  4029.                                  Figure 1
  4030.  
  4031.   Note that there are three rows in which Bob's salary remained constant at
  4032.   $70,000. Hence, the result should be two rows for Bob.
  4033.  
  4034.   Name    Salary  Start           Stop
  4035.  
  4036.   ----    ------  -----           ----
  4037.  
  4038.   Bob     60000   1993-01-01      1993-05-30
  4039.  
  4040.   Bob     70000   1993-06-01      1994-12-31
  4041.  
  4042.   One alternative is to give the user a printout of Salary and Title
  4043.   information, and have user determine when his/her salary changed. This
  4044.   alternative is not very appealing or realistic. A second alternative is to
  4045.   use SQL as much as possible.
  4046.  
  4047.   CREATE TABLE Temp(Salary, Start, Stop)
  4048.  
  4049.   AS      SELECT Salary, Start, Stop
  4050.  
  4051.           FROM Employee;
  4052.  
  4053.   repeat
  4054.  
  4055.           UPDATE Temp T1
  4056.  
  4057.           SET (T1.Stop) = (SELECT MAX(T2.Stop)
  4058.  
  4059.                            FROM Temp AS T2
  4060.  
  4061.                            WHERE T1.Salary = T2.Salary AND T1.Start < T2.Start
  4062.  
  4063.                                   AND T1.Stop >= T2.Start AND T1.Stop < T2.Stop)
  4064.  
  4065.           WHERE EXISTS (SELECT *
  4066.  
  4067.                         FROM Temp AS T2
  4068.  
  4069.                         WHERE T1.Salary = T2.Salary AND T1.Start < T2.Start
  4070.  
  4071.                                   AND T1.Stop >= T2.Start AND T1.Stop < T2.Stop)
  4072.  
  4073.           until no rows updated;
  4074.  
  4075.   DELETE FROM Temp T1
  4076.  
  4077.   WHERE EXISTS (SELECT *
  4078.  
  4079.                 FROM Temp AS T2
  4080.  
  4081.                 WHERE T1.Salary = T2.Salary
  4082.  
  4083.                           AND ((T1.Start > T2.Start AND T1.Stop <= T2.Stop)
  4084.  
  4085.                           OR (T1.Start >= T2.Start AND T1.Stop < T2.Stop))
  4086.  
  4087.   The loop finds those intervals that overlap or are adjacent and thus should
  4088.   be merged. The loop is executed log N times in the worst case, where N is
  4089.   the number of rows in a chain of overlapping or adjacent value-equivalent
  4090.   rows. The reader can simulate the query on the example table to convince
  4091.   him/herself of its correctness.
  4092.  
  4093.   A third alternative is to use SQL only to open a cursor on the table. A
  4094.   linked list of periods is maintained, each with a salary. This linked list
  4095.   should be initialized to empty.
  4096.  
  4097.   DECLARE emp_cursor CURSOR FOR
  4098.  
  4099.           SELECT Salary, Title, Start, Stop
  4100.  
  4101.           FROM Employee;
  4102.  
  4103.   OPEN emp_cursor;
  4104.  
  4105.   loop:
  4106.  
  4107.           FETCH emp_cursor INTO :salary, :start, :stop;
  4108.  
  4109.           if no-data returned then goto finished;
  4110.  
  4111.           find position in linked list to insert this information;
  4112.  
  4113.           goto loop;
  4114.  
  4115.   finished:
  4116.  
  4117.   CLOSE emp_cursor;
  4118.  
  4119.   iterate through linked list, printing out dates and salaries
  4120.  
  4121.   The linked list may not be necessary in this case if the cursor is ORDER BY
  4122.   Start.
  4123.   In any case, the query, a natural one, is quite difficult to express using
  4124.   the facilities present in SQL-92. The query is trivial in TSQL2.
  4125.  
  4126.           SELECT Salary
  4127.  
  4128.           FROM Employee
  4129.  
  4130.   2.4 JOIN
  4131.  
  4132.   A more drastic approach is to avoid the problem of extracting the salary
  4133.   history by reorganizing the schema to separate salary, title, and date of
  4134.   birth information (in the following, we ignore the date of birth, for
  4135.   simplicity).
  4136.  
  4137.           Employee1 (Name, Salary, Start DATE, Stop DATE)
  4138.  
  4139.           Employee2 (Name, Title, Start DATE, Stop DATE)
  4140.  
  4141.   The Employee1 table is as follows.
  4142.  
  4143.   Name    Salary  Start           Stop
  4144.  
  4145.   ----    ------  -----           ----
  4146.  
  4147.   Bob     60000   1993-01-01      1993-05-30
  4148.  
  4149.   Bob     70000   1993-06-01      1993-12-31
  4150.  
  4151.   Here is the example Employee2 table.
  4152.  
  4153.   Name    Title                   Start           Stop
  4154.  
  4155.   ----    ------                  -----           ----
  4156.  
  4157.   Bob     Assistant Provost       1993-01-01      1993-09-30
  4158.  
  4159.   Bob     Provost                 1993-10-01      1994-01-31
  4160.  
  4161.   Bob     Professor               1994-02-01      1994-12-31
  4162.  
  4163.   With this change, getting the salary information for an employee is now
  4164.   easy.
  4165.  
  4166.           SELECT Salary, Start, Stop
  4167.  
  4168.           FROM Employee1
  4169.  
  4170.           WHERE Name = 'Bob'
  4171.  
  4172.   But what if the OAP wants a table of salary, title intervals (that is,
  4173.   suppose the OAP wishes a table to be computed in the form of Figure 1)? One
  4174.   alternative is to print out two tables, and let the user figure out the
  4175.   combinations. A second alternative is to use SQL entirely. Unfortunately,
  4176.   this query must do a case analysis of how each row of Employee1 overlaps
  4177.   each row of Employee2; there are four possible cases.
  4178.  
  4179.   SELECT Employee1.Name, Salary, Dept, Employee1.Start, Employee1.Stop
  4180.  
  4181.   FROM Employee1, Employee2
  4182.  
  4183.   WHERE Employee1.Name = Employee2.Name
  4184.  
  4185.        AND Employee2.Start <= Employee1.Start AND Employee1.Stop < Employee2.Stop
  4186.  
  4187.   UNION
  4188.  
  4189.   SELECT Employee1.Name, Salary, Dept, Employee1.Start, Employee2.Stop
  4190.  
  4191.   FROM Employee1, Employee2
  4192.  
  4193.   WHERE Employee1.Name = Employee2.Name
  4194.  
  4195.        AND Employee1.Start >= Employee2.Start AND Employee2.Stop < Employee1.Stop
  4196.  
  4197.           AND Employee1.Start < Employee2.Stop
  4198.  
  4199.   UNION
  4200.  
  4201.   SELECT Employee1.Name, Salary, Dept, Employee2.Start, Employee1.Stop
  4202.  
  4203.   FROM Employee1, Employee2
  4204.  
  4205.   WHERE Employee1.Name = Employee2.Name
  4206.  
  4207.        AND Employee2.Start > Employee1.Start AND Employee1.Stop < Employee2.Stop
  4208.  
  4209.           AND Employee2.Start < Employee1.Stop
  4210.  
  4211.   UNION
  4212.  
  4213.   SELECT Employee1.Name, Salary, Dept, Employee2.Start, Employee2.Stop
  4214.  
  4215.   FROM Employee1, Employee2
  4216.  
  4217.   WHERE Employee1.Name = Employee2.Name
  4218.  
  4219.        AND Employee2.Start > Employee1.Start AND Employee2.Stop < Employee1.Stop
  4220.  
  4221.   Getting all the cases right is a challenging task. In TSQL2, performing a
  4222.   temporal join is just what one would expect.
  4223.  
  4224.           SELECT Employee1.Name, Salary, Dept
  4225.  
  4226.           FROM Employee1, Employee2
  4227.  
  4228.           WHERE Employee1.Name = Employee2.Name
  4229.  
  4230.   2.5 AGGREGATES
  4231.  
  4232.   Now the OAP is asked, what is the maximum salary? Before adding time, this
  4233.   was easy.
  4234.  
  4235.           SELECT MAX(Salary)
  4236.  
  4237.           FROM Employee
  4238.  
  4239.   Now that the salary history is stored, we'd like a history of the maximum
  4240.   salary over time. The problem, of course, is that SQL does not provide
  4241.   temporal aggregates. The easy way to do this is to print out the
  4242.   information, and scan manually for the maximums. An alternative is to be
  4243.   tricky and convert the snapshot aggregate query into a non-aggregate query,
  4244.   then convert that into a temporal query. The non-aggregate query finds those
  4245.   salaries for which a greater salary does not exist.
  4246.  
  4247.           SELECT Salary
  4248.  
  4249.           FROM Employee AS E1
  4250.  
  4251.           WHERE NOT EXISTS (SELECT *
  4252.  
  4253.                             FROM Employee AS E2
  4254.  
  4255.                             WHERE E2.Salary > E1.Salary)
  4256.  
  4257.   Converting this query into a temporal query is far from obvious. The
  4258.   following is one approach.
  4259.  
  4260.   CREATE TABLE Temp (Salary, Start, Stop)
  4261.  
  4262.   AS      SELECT Salary, Start, Stop
  4263.  
  4264.           FROM Employee;
  4265.  
  4266.   INSERT INTO Temp
  4267.  
  4268.           SELECT T.Salary, T.Start, E.Start
  4269.  
  4270.           FROM Temp AS T, Employee AS E
  4271.  
  4272.           WHERE E.Start >= T.Start AND E.Start < T.Stop AND E.Salary > T.Salary;
  4273.  
  4274.   INSERT INTO Temp
  4275.  
  4276.           SELECT T.Salary, T.Stop, E.Stop
  4277.  
  4278.           FROM Temp AS T, Employee AS E
  4279.  
  4280.           WHERE E.Stop > T.Start AND E.Stop <= T.Stop AND E.Salary > T.Salary;
  4281.  
  4282.   DELETE FROM Temp T
  4283.  
  4284.   WHERE EXISTS (SELECT *
  4285.  
  4286.                 FROM Employee AS E
  4287.  
  4288.                 WHERE ((T.Start => E.Start AND T.Start < E.Stop)
  4289.  
  4290.                           OR (E.Start >= T.Start AND E.Start < T.Stop))
  4291.  
  4292.                       AND E.Salary > T.Salary;
  4293.  
  4294.   This approach creates an auxiliary table. We add to this table the lower
  4295.   period of a period subtraction and the upper period of a period subtraction.
  4296.   We then delete all periods that overlap with some row defined by the
  4297.   subquery, thereby effecting the NOT EXISTS. Finally we generate from the
  4298.   auxiliary table maximal periods, in the same way that the salary information
  4299.   was computed above. As one might imagine, such SQL code is extremely
  4300.   inefficient to execute, given the complex nested queries with inequality
  4301.   predicates.
  4302.  
  4303.   A third alternative is to use SQL as little as possible, and instead compute
  4304.   the desired maximum history in a host language using cursors.
  4305.  
  4306.   The query in TSQL2 is again straightforward and intuitive.
  4307.  
  4308.           SELECT MAX(Salary)
  4309.  
  4310.           FROM Employee
  4311.  
  4312.   3. SUMMARY
  4313.  
  4314.   Time-varying data is manipulated in most database applications. Valid-time
  4315.   support is absent in SQL. Many common temporal queries are either difficult
  4316.   to simulate in SQL, or require embedding SQL in a procedural language, due
  4317.   to SQL's lack of support for valid-time tables in its data model and query
  4318.   constructs.
  4319.  
  4320.   Elsewhere, we showed that adding valid-time support requires few changes to
  4321.   the DBMS implementation, can dramatically simplify some queries and enable
  4322.   others, and can later enable optimizations in storage structures, indexing
  4323.   methods, and optimization strategies that can yield significant performance
  4324.   improvements.
  4325.  
  4326.   With a new part of SQL3 supporting time-varying information, we can begin to
  4327.   address such applications, enabling SQL3 to better manage temporal data.
  4328.  
  4329.   ----------------------------------------------------------------------------
  4330.              Accredited Standards Committee* X3, Information Technology
  4331.   NEWS RELEASE
  4332.  
  4333.   Doc. No.:       PR/96-0002
  4334.  
  4335.   Reply to:       Barbara Bennett at bbennett@itic.nw.dc.us
  4336.  
  4337.                X3 Announces the Approval of a New Project, ISO/IEC
  4338.  
  4339.                            9075 Part 7:  SQL/Temporal
  4340.  
  4341.   Washington D.C., January 1996 -- Accredited Standards Committee
  4342.  
  4343.   X3, Information Technology is announcing the approval of a new
  4344.  
  4345.   project on SQL/Temporal Support, ISO/IEC 9075 Part 7, with the work
  4346.  
  4347.   being done in Technical Committee X3H2, Database.
  4348.  
  4349.   The scope of this proposed standard specifies a new Part of the emerging
  4350.  
  4351.   SQL3 standard, e.g., Part 7, Temporal SQL, to be extensions to the SQL
  4352.  
  4353.   language supporting storage, retrieval, and manipulation of temporal data
  4354.  
  4355.   in an SQL database environment.
  4356.  
  4357.   The next X3H2 meeting is scheduled for March 11-14, 1996 in
  4358.  
  4359.   Kansas.
  4360.  
  4361.   Inquiries regarding this project should be sent to the Chairman of
  4362.  
  4363.   X3H2, Dr. Donald R. Deutsch, Sybase, Inc., Suite 800, 6550 Rock Spring
  4364.  
  4365.   Drive, Bethesda, MD  20817.  Email: deutsch@sybase.com.
  4366.  
  4367.   An initial call for possible patents and other pertinent issues
  4368.  
  4369.   (copyrights, trademarks) is now being issued.  Please submit
  4370.  
  4371.   information on these issues to the X3 Secretariat at 1250 Eye Street
  4372.  
  4373.   NW, Suite 200, Washington DC  20005. Email: x3sec@itic.nw.dc.us
  4374.  
  4375.   FAX:  (202)638-4922.
  4376.  
  4377.   ----------------------------------------------------------------------------
  4378.  
  4379.   X3 Press Index
  4380.  
  4381.   X3 Home Page
  4382.  
  4383.   32.17.  Part 8 - ISO/ANSI SQL MULTIMEDIA (SQL/MM)
  4384.  
  4385.        A new ISO/IEC international standardization project for development of an
  4386.        SQL class library for multimedia applications was approved in early 1993.
  4387.        This new standardization activity, named SQL Multimedia (SQL/MM), will
  4388.        specify packages of SQL abstract data type (ADT) definitions using the
  4389.        facilities for ADT specification and invocation provided in the emerging
  4390.        SQL3 specification. SQL/MM intends to standardize class libraries for
  4391.        science and engineering, full-text and document processing, and methods for
  4392.        the management of multimedia objects such as image, sound, animation, music,
  4393.        and video. It will likely provide an SQL language binding for multimedia
  4394.        objects defined by other JTC1 standardization bodies (e.g. SC18 for
  4395.        documents, SC24 for images, and SC29 for photographs and motion pictures).
  4396.  
  4397.        The Project Plan for SQL/MM indicates that it will be a multi-part standard
  4398.        consisting of an evolving number of parts. Part 1 will be a Framework that
  4399.        specifies how the other parts are to be constructed. Each of the other parts
  4400.        will be devoted to a specific SQL application package. The following SQL/MM
  4401.        Part structure exists as of August 1994:
  4402.  
  4403.           * Part 1: Framework A non-technical description of how the document is
  4404.             structured.
  4405.           * Part 2: Full Text Methods and ADTs for text data processing. About 45
  4406.             pages.
  4407.           * Part 3: Spatial Methods and ADTs for spatial data management. About 200
  4408.             pages with active contributions from Spatial Data experts from 3
  4409.             national bodies.
  4410.           * Part 4: General Purpose Methods and ADTs for complex numbers,
  4411.             Facilities include trig and exponential functions, vectors, sets, etc.
  4412.             Currently about 90 pages.
  4413.  
  4414.        There are a number of standards efforts in the area of Spatial and
  4415.        Geographic information:
  4416.  
  4417.           * ANSI X3L1 - Geographic Information Systems.
  4418.             Mark Ashworth of Unisys is the liason between X3L1 and ANSI X3H2. He is
  4419.             also the editor for parts 1, 3, and 4 of the SQL/MM draft.
  4420.           * ISO TC 211 - Geographic information/Geomatics
  4421.  
  4422.        ----------------------------------------------------------------------------
  4423.  
  4424.   33.  Technical support for PostgreSQL
  4425.  
  4426.   If you have any technical question or encounter any problem you can e-
  4427.   mail to: pgsql-questions@postgresql.org and expect e-mail answer in
  4428.   less than a day. As the user-base of internet product is very vast,
  4429.   and users support other users, internet will be capable of giving
  4430.   technical support to billions of users easily. Email support is much
  4431.   more convenient than telephone support as you can cut and paste error
  4432.   messages, program output etc.. and easily transmit to mailing
  4433.   list/newsgroup.
  4434.  
  4435.   In the near future, PostgreSQL organisation will be selling technical
  4436.   support to large/small companies, the revenue generated will be used
  4437.   for maintaining several mirror sites (web and ftp) around the world.
  4438.   The revenue will also be used to produce printed documentation,
  4439.   guides, textbooks which will help the customers. The profits will also
  4440.   be used to construct buildings/class-rooms and offer technical courses
  4441.   in database administration/management and conduct annual user
  4442.   conferences.  This would help PostgreSQL organisation to stand on its
  4443.   feet.
  4444.  
  4445.   You can also take help from professional consulting firms like
  4446.   Anderson, WGS (Work Group Solutions). Contact them for help -
  4447.  
  4448.   ╖  Work Group Solutions  <http://www.wgs.com>
  4449.  
  4450.   ╖  Anderson Consulting  <http://www.ac.com>
  4451.  
  4452.   34.  Economic and Business Aspects
  4453.  
  4454.   Commercial databases pay many taxes like federal, state, sales,
  4455.   employment, social security, medicare taxes, health care for
  4456.   employees, bunch of benefits for employees, marketing and
  4457.   advertisement costs. All these costs do not go directly for the
  4458.   development of the database. When you buy a commercial database, some
  4459.   portion of the amount goes for overheads like taxes, expenses and
  4460.   balance for database R&D costs.
  4461.  
  4462.   Also commercial databases have to pay for buildings/real-estates and
  4463.   purchase Unix machines, install and maintain them. All of these costs
  4464.   are passed onto customers.
  4465.  
  4466.   PostgreSQL has the advantage over commercial databases as there is no
  4467.   direct tax since it is made on the internet. A very vast group of
  4468.   people contribute to the development of the PostgreSQL. For example,
  4469.   in a hypothetical case, if there are one million companies in U.S.A
  4470.   and each contribute about $ 10 (worth of software to PostgreSQL) than
  4471.   each and every company will get ten million dollars!! This is the
  4472.   magic of software development on internet.
  4473.  
  4474.   Currently, PostgreSQL source code is about 2,00,000 lines of "C",
  4475.   "C++" code. If cost of each line of "C" code is $ 10 than the total
  4476.   cost of PostgreSQL as of today is $ 2,000,000 (two million dollars!!).
  4477.  
  4478.   Many companies already develop in-house vast amount of "C", "C++"
  4479.   code. Hence by taking in the source code of PostgreSQL and
  4480.   collaborating with other companies on internet will greatly benefit
  4481.   the company saving time and efforts.
  4482.  
  4483.   35.  List of Other Databases
  4484.  
  4485.   Listed below are other SQL databases for Unix, Linux.
  4486.  
  4487.   ╖  Click and go to Applications->databases.
  4488.      <http://www.caldera.com/tech-ref/linuxapps/linapps.html>
  4489.  
  4490.   ╖  Click and go to Applications->databases.
  4491.      <http://www.xnet.com/~blatura/linapps.shtml>
  4492.  
  4493.   ╖  Database resources  <http://linas.org/linux/db.html> This was
  4494.      written by Linas Vepstas: linas@fc.net
  4495.  
  4496.   ╖  Free Database List
  4497.      <http://cuiwww.unige.ch:80/~scg/FreeDB/FreeDB.list.html>
  4498.  
  4499.   ╖  Browne's RDBMS List <http://www.hex.net/~cbbrowne/rdbms.html>
  4500.      written by Christopher B. Browne cbbrowne@hex.net
  4501.  
  4502.   ╖  SAL's List of Relational DBMS <http://SAL.KachinaTech.COM/H/1/>
  4503.  
  4504.   ╖  SAL's List of Object-Oriented DBMS
  4505.      <http://SAL.KachinaTech.COM/H/2/>
  4506.  
  4507.   ╖  SAL's List of Utilites and Other Databases
  4508.      <http://SAL.KachinaTech.COM/H/3/>
  4509.  
  4510.   ╖  ACM SIGMOD Index of Publicly Available Database Software
  4511.      <http://bunny.cs.uiuc.edu/sigmod/databaseSoftware/>
  4512.  
  4513.   36.  Internet World Wide Web Searching Tips
  4514.  
  4515.   Internet is very vast and it has vast number of software and has a
  4516.   ocean of information underneath. It is growing at the rate of 500%
  4517.   annually world wide. It is estimated that there are about 90 million
  4518.   Web sites world wide!
  4519.  
  4520.   To search for a information you would use search engines like "Yahoo",
  4521.   "Netscape", "Lycos" etc. Go to Yahoo, click on search.  Use filtering
  4522.   options to narrow down your search criteria. The default search action
  4523.   is "Intelligent search" which is more general and lists all
  4524.   possiblities. Click on "Options" to select "EXACT phrase" search,
  4525.   "AND" search, "OR" search, etc.. This way you would find the
  4526.   information you need much faster.
  4527.  
  4528.   37.  Conclusion
  4529.  
  4530.   After researching all the available databases which are free and
  4531.   source code is available, it was found that ONLY PostgreSQL is the
  4532.   MOST mature, most widely used and robust RDBMS SQL free database
  4533.   (object relational) in the world.  PostgreSQL is very appealing as lot
  4534.   of work had already been done and it has ODBC, JDBC drivers using
  4535.   these it is possible to write applications independent of the
  4536.   databases. The applications written in PostgreSQL using ODBC, JDBC
  4537.   drivers are easily portable to other databases like Oracle, Sybase and
  4538.   Informix. And applications written for Oracle, Sybase and Informix
  4539.   using ODBC, JDBC drivers are easily portable to PostgreSQL database.
  4540.  
  4541.   38.  FAQ - Questions on PostgreSQL
  4542.  
  4543.   38.1.  Latest version of FAQ - Questions on PostgreSQL
  4544.  
  4545.   The FAQ is included here since not all the users have the browsers
  4546.   like Netscape and Internet access. Users may use GnuInfo, Ghostview,
  4547.   vi editor or man command. This document is generated in 10 different
  4548.   formats like GnuInfo, RTF, Plain-Text, Man page, Postscript etc.. and
  4549.   is distributed on Linux CDROMs.  Please refer to the latest version of
  4550.   FAQ which is at <http://www.postgresql.org/docs/faq-english.shtml> in
  4551.   case you have access to Internet."
  4552.  
  4553.   The FAQ is included here just for your convenience.
  4554.  
  4555.   38.2.  Extract of FAQ from main PostgreSQL Web site
  4556.  
  4557.   If you have access to internet, please click on this URL now for
  4558.   latest version
  4559.  
  4560.   ╖  <http://www.postgresql.org/docs>
  4561.  
  4562.   Frequently Asked Questions (FAQ) for PostgreSQL
  4563.  
  4564.   Last updated: Mon Nov 17 19:47:15 EST 1997
  4565.   Version: 6.2.1
  4566.  
  4567.   Current maintainer: Bruce Momjian (maillist@candle.pha.pa.us)
  4568.  
  4569.   The most recent version of this document can be viewed at the postgreSQL
  4570.   Web site, http://postgreSQL.org.
  4571.  
  4572.   Linux-specific questions are answered in
  4573.   http://postgreSQL.org/docs/FAQ-linux.shtml.
  4574.  
  4575.   Irix-specific questions are answered in
  4576.   http://postgreSQL.org/docs/FAQ-irix.shtml.
  4577.  
  4578.   Changes in this version (* = modified, + = new):
  4579.  
  4580.   ---------------------------------------------------------------------------
  4581.  
  4582.   Questions answered:
  4583.  
  4584.   1) General questions
  4585.  
  4586.   1.1) What is PostgreSQL?
  4587.   1.2) What does PostgreSQL run on?
  4588.   1.3) Where can I get PostgreSQL?
  4589.   1.4) What's the copyright on PostgreSQL?
  4590.   1.5) Support for PostgreSQL
  4591.   1.6) Latest release of PostgreSQL
  4592.   1.7) Is there a commercial version of PostgreSQL?
  4593.   1.8) What documentation is available for PostgreSQL?
  4594.   1.9) What version of SQL does PostgreSQL use?
  4595.   1.10) Does PostgreSQL work with databases from earlier versions of
  4596.   postgres?
  4597.   1.11) Are there ODBC drivers for PostgreSQL?
  4598.   1.12) What tools are available for hooking postgres to Web pages?
  4599.   1.13) Does PostgreSQL have a graphical user interface? A report generator?
  4600.   A embedded query language interface?
  4601.  
  4602.   2) Installation/Configuration questions
  4603.  
  4604.   2.1) initdb doesn't run
  4605.   2.2) when I start up the postmaster, I get "FindBackend: could not find a
  4606.   backend to execute..." "postmaster: could not find backend to execute..."
  4607.   2.3) The system seems to be confused about commas, decimal points, and date
  4608.   formats.
  4609.   2.4) How do I install PostgreSQL somewhere other than /usr/local/pgsql?
  4610.   2.5) When I run postmaster, I get a Bad System Call core dumped message.
  4611.   2.6) When I try to start the postmaster, I get IpcMemoryCreate errors.
  4612.   2.7) I have changed a source file, but a recompile does not see the change?
  4613.   2.8) How do I prevent other hosts from accessing my PostgreSQL
  4614.   2.9) I can't access the database as the 'root' user.
  4615.   2.10) All my servers crash under concurrent table access. Why?
  4616.   2.11) How do I tune the database engine for better performance?
  4617.   2.12) What debugging features are available in PostgreSQL?
  4618.   2.13) How do I enable more than 32 concurrent backends?
  4619.  
  4620.   3) Operational questions
  4621.  
  4622.   3.1) Does PostgreSQL support nested subqueries?
  4623.   3.2) I've having a lot of problems using rules.
  4624.   3.3) I can't seem to write into the middle of large objects reliably.
  4625.   3.4) How can I write client applications to PostgreSQL?
  4626.   3.5) How do I set up a pg_group?
  4627.   3.6) What is the exact difference between binary cursors and normal
  4628.   cursors?
  4629.   3.7) What is a R-tree index and what is it used for?
  4630.   3.8) What is the maximum size for a tuple?
  4631.   3.9) I defined indices but my queries don't seem to make use of them. Why?
  4632.   3.10) How do I do regular expression searches? case-insensitive regexp
  4633.   searching?
  4634.   3.11) I experienced a server crash during a vacuum. How do I remove the
  4635.   lock file?
  4636.   3.12) What is the difference between the various character types?
  4637.   3.13) In a query, how do I detect if a field is NULL?
  4638.   3.14) How do I see how the query optimizer is evaluating my query?
  4639.   3.15) How do I create a serial field?
  4640.   3.16) What are the pg_psort.XXX files in my database directory?
  4641.   3.17) Why can't I connect to my database from another machine?
  4642.   3.18) How do I find out what indexes or operations are defined in the
  4643.   database?
  4644.   3.19) What is the time-warp feature and how does it relate to vacuum?
  4645.   3.20) What is an oid? What is a tid?
  4646.   3.21) What is the meaning of some of the terms used in Postgres?
  4647.   3.22) What is Genetic Query Optimization?
  4648.   3.23) How do you remove a column from a table?
  4649.   3.24) How do SELECT only the first few rows of a query?
  4650.   3.25) Why can't I create a column named "time"?
  4651.  
  4652.   4) Questions about extending PostgreSQL
  4653.  
  4654.   4.1) I wrote a user-defined function and when I run it in psql, it dumps
  4655.   core.
  4656.   4.2) I get messages of the type NOTICE:PortalHeapMemoryFree: 0x402251d0
  4657.   4.3) I've written some nifty new types and functions for PostgreSQL.
  4658.   4.4) How do I write a C function to return a tuple?
  4659.  
  4660.   5) Bugs
  4661.  
  4662.   5.1) How do I make a bug report?
  4663.  
  4664.   ---------------------------------------------------------------------------
  4665.  
  4666.   Section 1: General Questions
  4667.  
  4668.   1.1) What is PostgreSQL?
  4669.  
  4670.   PostgreSQL is an enhancement of the POSTGRES database management system, a
  4671.   next-generation DBMS research prototype. While PostgreSQL retains the
  4672.   powerful data model and rich data types of POSTGRES, it replaces the
  4673.   PostQuel query language with an extended subset of SQL. PostgreSQL is free
  4674.   and the complete source is available.
  4675.  
  4676.   PostgreSQL development is being performed by a team of Internet developers
  4677.   who all subscribe to the PostgreSQL development mailing list. The current
  4678.   coordinator is Marc G. Fournier (scrappy@postgreSQL.org). (See below on how
  4679.   to join). This team is now responsible for all current and future
  4680.   development of PostgreSQL.
  4681.  
  4682.   The authors of PostgreSQL 1.01 were Andrew Yu and Jolly Chen. Many others
  4683.   have contributed to the porting, testing, debugging and enhancement of the
  4684.   code. The original Postgres code, from which PostgreSQL is derived, was the
  4685.   effort of many graduate students, undergraduate students, and staff
  4686.   programmers working under the direction of Professor Michael Stonebraker at
  4687.   the University of California, Berkeley.
  4688.  
  4689.   The original name of the software at Berkeley was Postgres. When SQL
  4690.   functionality was added in 1995, its name was changed to Postgres95. The
  4691.   name was changed at the end of 1996 to PostgreSQL.
  4692.  
  4693.   1.2) What does PostgreSQL run on?
  4694.   The authors have compiled and tested PostgreSQL on the following
  4695.   platforms(some of these compiles require gcc 2.7.0):
  4696.  
  4697.      * aix - IBM on AIX 3.2.5 or 4.x
  4698.      * alpha - DEC Alpha AXP on Digital Unix 2.0, 3.2, 4.0
  4699.      * BSD44_derived - OSs derived from 4.4-lite BSD (NetBSD, FreeBSD)
  4700.      * bsdi - BSD/OS 2.0, 2.01, 2.1, 3.0
  4701.      * dgux - DG/UX 5.4R4.11
  4702.      * hpux - HP PA-RISC on HP-UX 9.0, 10
  4703.      * i386_solaris - i386 Solaris
  4704.      * irix5 - SGI MIPS on IRIX 5.3
  4705.      * linux - Intel x86 on Linux 2.0 and Linux ELF SPARC on Linux ELF PPC on
  4706.        Linux Elf (For non-ELF Linux, see LINUX_ELF below).
  4707.      * sco - SCO 3.2v5
  4708.      * sparc_solaris - SUN SPARC on Solaris 2.4, 2.5, 2.5.1
  4709.      * sunos4 - SUN SPARC on SunOS 4.1.3
  4710.      * svr4 - Intel x86 on Intel SVR4 and MIPS
  4711.      * ultrix4 - DEC MIPS on Ultrix 4.4
  4712.  
  4713.   The following platforms have known problems/bugs:
  4714.  
  4715.      * nextstep - Motorola MC68K or Intel x86 on NeXTSTEP 3.2
  4716.  
  4717.   1.3) Where can I get PostgreSQL?
  4718.  
  4719.   The primary anonymous ftp site for PostgreSQL is:
  4720.  
  4721.      * ftp://ftp.postgreSQL.org/pub
  4722.  
  4723.   A mirror site exists at:
  4724.  
  4725.      * ftp://postgres95.vnet.net/pub/postgres95
  4726.      * ftp://ftp.luga.or.at/pub/postgres95
  4727.      * ftp://cal011111.student.utwente.nl/pub/postgres95
  4728.      * ftp://ftp.uni-trier.de/pub/database/rdbms/postgres/postgres95
  4729.      * ftp://rocker.sch.bme.hu
  4730.  
  4731.   1.4) What's the copyright on PostgreSQL?
  4732.  
  4733.   PostgreSQL is subject to the following COPYRIGHT.
  4734.  
  4735.   PostgreSQL Data Base Management System
  4736.  
  4737.   Copyright (c) 1994-6 Regents of the University of California
  4738.  
  4739.   Permission to use, copy, modify, and distribute this software and its
  4740.   documentation for any purpose, without fee, and without a written agreement
  4741.   is hereby granted, provided that the above copyright notice and this
  4742.   paragraph and the following two paragraphs appear in all copies.
  4743.  
  4744.   IN NO EVENT SHALL THE UNIVERSITY OF CALIFORNIA BE LIABLE TO ANY PARTY FOR
  4745.   DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, INCLUDING
  4746.   LOST PROFITS, ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS
  4747.   DOCUMENTATION, EVEN IF THE UNIVERSITY OF CALIFORNIA HAS BEEN ADVISED OF THE
  4748.   POSSIBILITY OF SUCH DAMAGE.
  4749.  
  4750.   THE UNIVERSITY OF CALIFORNIA SPECIFICALLY DISCLAIMS ANY WARRANTIES,
  4751.   INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
  4752.   AND FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS ON
  4753.   AN "AS IS" BASIS, AND THE UNIVERSITY OF CALIFORNIA HAS NO OBLIGATIONS TO
  4754.   PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  4755.  
  4756.   1.5) Support for PostgreSQL
  4757.  
  4758.   There is no official support for PostgreSQL from the original maintainers
  4759.   or from University of California, Berkeley. It is maintained through
  4760.   volunteer effort only.
  4761.  
  4762.   The main mailing list is: questions@postgreSQL.org. It is available for
  4763.   discussion o f matters pertaining to PostgreSQL, including but not limited
  4764.   to bug reports and fixes. For info on how to subscribe, send a mail with
  4765.   the lines in the body (not the subject line)
  4766.  
  4767.           subscribe
  4768.           end
  4769.  
  4770.   to questions-request@postgreSQL.org.
  4771.  
  4772.   There is also a digest list available. To subscribe to this list, send
  4773.   email to: questions-digest-request@postgreSQL.org with a BODY of:
  4774.  
  4775.           subscribe
  4776.           end
  4777.  
  4778.   Digests are sent out to members of this list whenever the main list has
  4779.   received around 30k of messages.
  4780.  
  4781.   There is a bugs mailing list available. To subscribe to this list, send
  4782.   email to bugs-request@postgreSQL.org with a BODY of:
  4783.  
  4784.   There is also a developers discussion mailing list available. To subscribe
  4785.   to this list, send email to hackers-request@postgreSQL.org with a BODY of:
  4786.  
  4787.           subscribe
  4788.           end
  4789.  
  4790.   Additional information about PostgreSQL can be found via the PostgreSQL WWW
  4791.   home page at:
  4792.  
  4793.        http://postgreSQL.org
  4794.  
  4795.   1.6) Latest release of PostgreSQL
  4796.  
  4797.   The latest release of PostgreSQL is version 6.2.1, which was released on
  4798.   October 17th, 1997. For information about what is new in 6.2.1, see our
  4799.   TODO list on our WWW page.
  4800.  
  4801.   We plan to have major releases every three months.
  4802.  
  4803.   1.7) Is there a commercial version of PostgreSQL?
  4804.  
  4805.   Illustra Information Technology (a wholly owned subsidiary of Informix
  4806.   Software, Inc.) sells an object-relational DBMS called Illustra that was
  4807.   originally based on postgres. Illustra has cosmetic similarities to
  4808.   PostgreSQL but has more features, is more robust, performs better, and
  4809.   offers real documentation and support. On the flip side, it costs money.
  4810.   For more information, contact sales@illustra.com
  4811.  
  4812.   1.8) What documentation is available for PostgreSQL?
  4813.  
  4814.   A user manual, manual pages, and some small test examples are included in
  4815.   the distribution. The sql and built-in manual pages are particularly
  4816.   important.
  4817.  
  4818.   The www page contains pointers to an implementation guide and five papers
  4819.   written about postgres design concepts and features.
  4820.  
  4821.   1.9) What version of SQL does PostgreSQL use?
  4822.  
  4823.   PostgreSQL supports a subset of SQL-92. It has most of the important
  4824.   constructs but lacks some of the functionality. The most visible
  4825.   differences are:
  4826.      * no support for nested subqueries
  4827.      * no HAVING clause under a GROUP BY
  4828.  
  4829.   On the other hand, you get to create user-defined types, functions,
  4830.   inheritance etc. If you're willing to help with PostgreSQL coding,
  4831.   eventually we can also add the missing features listed above.
  4832.  
  4833.   1.10) Does PostgreSQL work with databases from earlier versions of
  4834.   postgres?
  4835.  
  4836.   PostgreSQL v1.09 is compatible with databases created with v1.01.
  4837.  
  4838.   Upgrading to 6.2.1 from pre-6.2 requires a dump and restore.
  4839.  
  4840.   Upgrading to 6.2.1 from 6.2 does not require a dump, but see the
  4841.   appropriate /migration file in the distribution.
  4842.  
  4843.   Those ugrading from versions earlier than 1.09 must upgrade to 1.09 first
  4844.   without a dump/reload, then dump the data from 1.09, and then load it into
  4845.   6.2.1.
  4846.  
  4847.   1.11) Are there ODBC drivers for PostgreSQL?
  4848.  
  4849.   There are two ODBC drivers available, PostODBC and OpenLink ODBC.
  4850.  
  4851.   For all people being interested in PostODBC, there are now two mailing
  4852.   lists devoted to the discussion of PostODBC. The mailing lists are:
  4853.  
  4854.      * postodbc-users@listserv.direct. net
  4855.      * postodbc-developers@listse rv.direct.net
  4856.  
  4857.   these lists are ordinary majordomo mailing lists. You can subscribe by
  4858.   sending a mail to:
  4859.  
  4860.      * majordomo@listserv.direct.net
  4861.  
  4862.   OpenLink ODBC is very popular. You can get it from
  4863.   http://www.openlinksw.com/postgres.html. It works with our standard ODBC
  4864.   client software so you'll have Postgres ODBC available on every client
  4865.   platform we support (Win, Mac, Unix, VMS).
  4866.  
  4867.   We will probably be selling this product to people who need
  4868.   commercial-quality support, but a freeware version will always be
  4869.   available. Questions to postgres95@openlink.co.uk.
  4870.  
  4871.   1.12) What tools are available for hooking postgres to Web pages?
  4872.  
  4873.   For web integration, PHP is an excellent interface. The URL for that is
  4874.   http://php.iquest.net
  4875.  
  4876.   PHP is great for simple stuff, but for more complex stuff, some still use
  4877.   the perl interface and CGI.pm.
  4878.  
  4879.   An WWW gatway based on WDB using perl can be downloaded from:
  4880.  
  4881.      * http://www.eol.ists.ca/~dunlop/wdb -p95
  4882.  
  4883.   1.13) Does PostgreSQL have a graphical user interface? A report generator?
  4884.   A embedded query language interface?
  4885.  
  4886.   No. No. No. Not in the official distribution at least. Some users have
  4887.   reported some success at using 'pgbrowse' and 'onyx' as frontends to
  4888.   PostgreSQL. Several contributions are working on tk based frontend tools.
  4889.   Ask on the mailing list.
  4890.  
  4891.   ---------------------------------------------------------------------------
  4892.   Section 2: Installation Questions
  4893.  
  4894.   2.1) initdb doesn't run
  4895.  
  4896.      * check to see that you have the proper paths set
  4897.      * check that the 'postgres' user owns all the right files
  4898.      * ensure that there are files in $PGDATA/files, and that they are
  4899.        non-empty. If they aren't, then "gmake install" failed for some reason
  4900.  
  4901.   2.2) when I start up the postmaster, I get "FindBackend: could not find a
  4902.   backend to execute..." "postmaster: could not find backend to execute..."
  4903.  
  4904.   You probably do not have the right path set up. The 'postgres' executable
  4905.   needs to be in your path.
  4906.  
  4907.   2.3) The system seems to be confused about commas, decimal points, and date
  4908.   formats.
  4909.  
  4910.   Check your locale configuration. PostgreSQL uses the locale settings of the
  4911.   user that ran the postmaster process. Set those accordingly for your
  4912.   operating environment.
  4913.  
  4914.   2.4) How do I install PostgreSQL somewhere other than /usr/local/pgsql?
  4915.  
  4916.   You need to edit Makefile.global and change POSTGRESDIR accordingly, or
  4917.   create a Makefile.custom and define POSTGRESDIR there.
  4918.  
  4919.   2.5) When I run postmaster, I get a Bad System Call core dumped message.
  4920.  
  4921.   It could be a variety of problems, but first check to see that you have
  4922.   system V extensions installed on your kernel. PostgreSQL requires kernel
  4923.   support for shared memory.
  4924.  
  4925.   2.6) When I try to start the postmaster, I get IpcMemoryCreate errors.
  4926.  
  4927.   You either do not have shared memory configured properly in kernel or you
  4928.   need to enlarge the shared memory available in the kernel. The exact amount
  4929.   you need depends on your architecture and how many buffers you configure
  4930.   postmaster to run with. For most systems, with default buffer sizes, you
  4931.   need a minimum of ~760K.
  4932.  
  4933.   2.7) I have changed a source file, but a recompile does not see the change?
  4934.  
  4935.   The Makefiles do not have the proper dependencies for include files. You
  4936.   have to do a 'make clean' and then another 'make'.
  4937.  
  4938.   2.8) How do I prevent other hosts from accessing my PostgreSQL backend?
  4939.  
  4940.   Use host-based authentication by modifying the file $PGDATA/pg_hba
  4941.   accordingly.
  4942.  
  4943.   2.9) I can't access the database as the 'root' user.
  4944.  
  4945.   You should not create database users with user id 0(root). They will be
  4946.   unable to access the database. This is a security precaution because of the
  4947.   ability of any user to dynamically link object modules into the database
  4948.   engine.
  4949.  
  4950.   2.10) All my servers crash under concurrent table access. Why?
  4951.  
  4952.   This problem can be caused by a kernel that is not configured to support
  4953.   semaphores.
  4954.  
  4955.   2.11) How do I tune the database engine for better performance?
  4956.  
  4957.   There are two things that can be done. You can use Openlink's option to
  4958.   disable fsync() by starting the postmaster with a '-o -F' option. This will
  4959.   prevent fsync()'s from flushing to disk after every transaction.
  4960.  
  4961.   You can also use the postmaster -B option to increase the number of shared
  4962.   memory buffers shared among the backend processes. If you make this
  4963.   parameter too high, the process will not start or crash unexpectedly. Each
  4964.   buffer is 8K and the defualt is 64 buffers.
  4965.  
  4966.   You can also use the postmaster -S option to increase the maximum amount of
  4967.   memory used by each backend process for temporary sorts. Each buffer is 1K
  4968.   and the defualt is 512 buffers.
  4969.  
  4970.   2.12) What debugging features are available in PostgreSQL?
  4971.  
  4972.   PostgreSQL has several features that report status information that can be
  4973.   valuable for debugging purposes.
  4974.  
  4975.   First, by running configure with the -enable-cassert option, many
  4976.   assert()'s monitor the progress of the backend and halt the program when
  4977.   something unexpected occurs.
  4978.  
  4979.   Both postmaster and postgres have several debug options available. First,
  4980.   whenever you start the postmaster, make sure you send the standard output
  4981.   and error to a log file, like:
  4982.  
  4983.           cd /usr/local/pgsql
  4984.           ./bin/postmaster >server.log 2>&1 &
  4985.  
  4986.   This will put a server.log file in the top-level PostgreSQL directory. This
  4987.   file can contain useful information about problems or errors encountered by
  4988.   the server. Postmaster has a -d option that allows even more detailed
  4989.   information to be reported. The -d option takes a number 1-3 that specifies
  4990.   the debug level. Be warned that a debug level of 3 generates large log
  4991.   files.
  4992.  
  4993.   You can actuall run the postgres backend from the command line, and type
  4994.   your SQL statement directly. This is recommended ONLY for debugging
  4995.   purposes. Note that a newline terminates the query, not a semicolon. If you
  4996.   have compiled with debugging symbols, you can use a debugger to see what is
  4997.   happening. Because the backend was not started from the postmaster, it is
  4998.   not running in an identical environment and locking/backend interaction
  4999.   problems may not be duplicated. Some operating system can attach to a
  5000.   running backend directly to diagnose problems.
  5001.  
  5002.   The postgres program has a -s, -A, -t options that can be very useful for
  5003.   debugging and performance measurements.
  5004.  
  5005.   You can also compile with profiling to see what functions are taking
  5006.   execution time. The backend profile files will be deposited in the
  5007.   pgsql/data/base/dbname directory. The client profile file will be put in
  5008.   the current directory.
  5009.  
  5010.   The EXPLAIN command (see this FAQ) allows you to see how PostgreSQL is
  5011.   interpreting your query.
  5012.  
  5013.   2.13) How do I enable more than 32 concurrent backends?
  5014.  
  5015.   Edit include/storage/sinvaladt.h, and change the value of MaxBackendId. In
  5016.   the future, we plan to make this a configurable prameter.
  5017.  
  5018.   ---------------------------------------------------------------------------
  5019.  
  5020.   Section 3: PostgreSQL Features
  5021.  
  5022.   3.1) Does PostgreSQL support nested subqueries?
  5023.  
  5024.   Subqueries are not implemented, but they can be simulated using sql
  5025.   functions.
  5026.  
  5027.   3.2) I've having a lot of problems using rules.
  5028.  
  5029.   Currently, the rule system in PostgreSQL is mostly broken. It works enough
  5030.   to support the view mechanism, but that's about it. Use PostgreSQL rules at
  5031.   your own peril.
  5032.  
  5033.   3.3) I can't seem to write into the middle of large objects reliably.
  5034.  
  5035.   The Inversion large object system in PostgreSQL is also mostly broken. It
  5036.   works well enough for storing large wads of data and reading them back out,
  5037.   but the implementation has some underlying problems. Use PostgreSQL large
  5038.   objects at your own peril.
  5039.  
  5040.   3.4) How can I write client applications to PostgreSQL?
  5041.  
  5042.   PostgreSQL supports a C-callable library interface called libpq as well as
  5043.   many others. See the /src/interfaces directory.
  5044.  
  5045.   Others have contributed a perl interface and a WWW gateway to PostgreSQL.
  5046.   See the PostgreSQL home pages for more details.
  5047.  
  5048.   3.5) How do I set up a pg_group?
  5049.  
  5050.   Currently, there is no easy interface to set up user groups. You have to
  5051.   explicitly insert/update the pg_group table. For example:
  5052.  
  5053.           jolly=> insert into pg_group (groname, grosysid, grolist)
  5054.           jolly=>     values ('posthackers', '1234', '(5443, 8261)');
  5055.           INSERT 548224
  5056.           jolly=> grant insert on foo to group posthackers;
  5057.           CHANGE
  5058.           jolly=>
  5059.  
  5060.   The fields in pg_group are:
  5061.  
  5062.      * groname: the group name. This a char16 and should be purely
  5063.        alphanumeric. Do not include underscores or other punctuation.
  5064.      * grosysid: the group id. This is an int4. This should be unique for
  5065.        each group.
  5066.      * grolist: the list of pg_user id's that belong in the group. This is an
  5067.        int4[].
  5068.  
  5069.   3.6) What is the exact difference between binary cursors and normal
  5070.   cursors?
  5071.  
  5072.   See the declare manual page for a description.
  5073.  
  5074.   3.7) What is a R-tree index and what is it used for?
  5075.  
  5076.   An r-tree index is used for indexing spatial data. A hash index can't
  5077.   handle range searches. A B-tree index only handles range searches in a
  5078.   single dimension. R-tree's can handle multi-dimensional data. For example,
  5079.   if a R-tree index can be built on an attribute of type 'point', the system
  5080.   can more efficient answer queries like select all points within a bounding
  5081.   rectangle.
  5082.  
  5083.   The canonical paper that describes the original R-Tree design is:
  5084.  
  5085.   Guttman, A. "R-Trees: A Dynamic Index Structure for Spatial Searching."
  5086.   Proc of the 1984 ACM SIGMOD Int'l Conf on Mgmt of Data, 45-57.
  5087.  
  5088.   You can also find this paper in Stonebraker's "Readings in Database
  5089.   Systems"
  5090.   Builtin R-Trees can handle polygons and boxes. In theory, R-trees can be
  5091.   extended to handle higher number of dimensions. In practice, extending
  5092.   R-trees require a bit of work and we don't currently have any documentation
  5093.   on how to do it.
  5094.  
  5095.   3.8) What is the maximum size for a tuple?
  5096.  
  5097.   Tuples are limited to 8K bytes. Taking into account system attributes and
  5098.   other overhead, one should stay well shy of 8,000 bytes to be on the safe
  5099.   side. To use attributes larger than 8K, try using the large objects
  5100.   interface.
  5101.  
  5102.   Tuples do not cross 8k boundaries so a 5k tuple will require 8k of storage.
  5103.  
  5104.   3.9) I defined indices but my queries don't seem to make use of them. Why?
  5105.  
  5106.   PostgreSQL does not automatically maintain statistics. One has to make an
  5107.   explicit 'vacuum' call to update the statistics. After statistics are
  5108.   updated, the optimizer has a better shot at using indices. Note that the
  5109.   optimizer is limited and does not use indices in some circumstances (such
  5110.   as OR clauses). For column-specific optimization statistics, use 'vacuum
  5111.   analyze'.
  5112.  
  5113.   If the system still does not see the index, it is probably because you have
  5114.   created an index on a field with the improper *_ops type. For example, you
  5115.   have created a CHAR(4) field, but have specified a char_ops index
  5116.   type_class.
  5117.  
  5118.   See the create_index manual page for information on what type classes are
  5119.   available. It must match the field type.
  5120.  
  5121.   Postgres does not warn the user when the improper index is created.
  5122.  
  5123.   Indexes not used for ORDER BY operations.
  5124.  
  5125.   3.10) How do I do regular expression searches? case-insensitive regexp
  5126.   searching?
  5127.  
  5128.   See the pgbuiltin manual page. Search for regular expression.
  5129.  
  5130.   3.11) I experienced a server crash during a vacuum. How do I remove the
  5131.   lock file?
  5132.  
  5133.   See the vacuum manual page.
  5134.  
  5135.   3.12) What is the difference between the various character types?
  5136.  
  5137.   Type            Internal Name   Notes
  5138.   --------------------------------------------------
  5139.   CHAR            char            1 character   )
  5140.   CHAR2           char2           2 characters  )
  5141.   CHAR4           char4           4 characters  ) optimized for a fixed length
  5142.   CHAR8           char8           8 characters  )
  5143.   CHAR16          char16          16 characters )
  5144.   CHAR(#)         bpchar          blank padded to the specified fixed length
  5145.   VARCHAR(#)      varchar         size specifies maximum length, no padding
  5146.   TEXT            text            length limited only by maximum tuple length
  5147.   BYTEA           bytea           variable-length array of bytes
  5148.  
  5149.   Remember, you need to use the internal name when creating indexes on these
  5150.   fields or when doing other internal operations.
  5151.  
  5152.   The last four types above are "varlena" types (i.e. the first four bytes is
  5153.   the length, followed by the data). CHAR(#) and VARCHAR(#) allocate the
  5154.   maximum number of bytes no matter how much data is stored in the field.
  5155.   TEXT and BYTEA are the only character types that have variable length on
  5156.   the disk.
  5157.  
  5158.   3.13) In a query, how do I detect if a field is NULL?
  5159.  
  5160.   You test the column with IS NULL and IS NOT NULL.
  5161.  
  5162.   3.14) How do I see how the query optimizer is evaluating my query?
  5163.  
  5164.   See the explain manual page.
  5165.  
  5166.   3.15) How do I create a serial field?
  5167.  
  5168.   Postgres does not allow the user to specifiy a user column as type SERIAL.
  5169.   Instead, you can use each row's oid field as a unique value. However, if
  5170.   you need to dump and reload the database, you need to use pgdump's -o
  5171.   option or COPY's WITH OIDS option to preserver the oids.
  5172.  
  5173.   We also have a SEQUENCE function that is similar to SERIAL. See the
  5174.   create_sequence manual page.
  5175.  
  5176.   Another valid way of doing this is to create a function:
  5177.  
  5178.           create table my_oids (f1 int4);
  5179.           insert into my_oids values (1);
  5180.           create function new_oid () returns int4 as
  5181.                   'update my_oids set f1 = f1 + 1;  select f1 from my_oids; '
  5182.           language 'sql';
  5183.  
  5184.   then:
  5185.  
  5186.           create table my_stuff (my_key int4, value text);
  5187.           insert into my_stuff values (new_oid(), 'hello');
  5188.  
  5189.   However, keep in mind there is a race condition here where one server could
  5190.   do the update, then another one do an update, and they both could select
  5191.   the same new id. This statement should be performed within a transaction.
  5192.  
  5193.   Yet another way is to use general trigger function autoinc() from
  5194.   contrib/spi/autoinc.c.
  5195.  
  5196.   3.16) What are the pg_psort.XXX files in my database directory?
  5197.  
  5198.   They are temporary sort files generated by the query executor. For example,
  5199.   if a sort needs to be done to satisfy an ORDER BY, some temp files are
  5200.   generated as a result of the sort.
  5201.  
  5202.   If you have no transactions or sorts running at the time, it is safe to
  5203.   delete the pg_psort.XXX files.
  5204.  
  5205.   3.17) Why can't I connect to my database from another machine?
  5206.  
  5207.   The default configuration allows only connections from tcp/ip host
  5208.   localhost. You need to add a host entry to the file pgsql/data/pg_hba. See
  5209.   the hba_conf manual page.
  5210.  
  5211.   3.18) How do I find out what indexes or operations are defined in the
  5212.   database?
  5213.  
  5214.   Run the file pgsql/src/tutorial/syscat.source. It illustrates many of the
  5215.  
  5216.   3.19) What is the time-warp feature and how does it relate to vacuum?
  5217.  
  5218.   PostgreSQL handles data changes differently than most database systems.
  5219.   When a row is changed in a table, the original row is marked with the time
  5220.   it was changed, and a new row is created with the current data. By default,
  5221.   only current rows are used in a table. If you specify a date/time after the
  5222.   table name in a FROM clause, you can access the data that was current at
  5223.   that time, i.e.
  5224.  
  5225.           SELECT *
  5226.           FROM employees ['July 24, 1996 09:00:00']
  5227.  
  5228.   displays employee rows in the table at the specified time. You can specify
  5229.   intervals like [date,date], [date,], [,date], or [,]. This last option
  5230.   accesses all rows that ever existed.
  5231.  
  5232.   INSERTed rows get a timestamp too, so rows that were not in the table at
  5233.   the desired time will not appear.
  5234.  
  5235.   Vacuum removes rows that are no longer current. This time-warp feature is
  5236.   used by the engine for rollback and crash recovery. Expiration times can be
  5237.   set with purge.
  5238.  
  5239.   In 6.0, once a table is vacuumed, the creation time of a row may be
  5240.   incorrect, causing time-traval to fail.
  5241.  
  5242.   The time-travel feature will be removed in 6.3.
  5243.  
  5244.   3.20) What is an oid? What is a tid?
  5245.  
  5246.   Oids are Postgres's answer to unique row ids or serial columns. Every row
  5247.   that is created in Postgres gets a unique oid. All oids generated by initdb
  5248.   are less than 16384 (from backend/access/transam.h). All post-initdb
  5249.   (user-created) oids are equal or greater that this. All these oids are
  5250.   unique not only within a table, or database, but unique within the entire
  5251.   postgres installation.
  5252.  
  5253.   Postgres uses oids in its internal system tables to link rows in separate
  5254.   tables. These oids can be used to identify specific user rows and used in
  5255.   joins. It is recommended you use column type oid to store oid values. See
  5256.   the sql(l) manual page to see the other internal columns.
  5257.  
  5258.   Tids are used to indentify specific physical rows with block and offset
  5259.   values. Tids change after rows are modified or reloaded. They are used by
  5260.   index entries to point to physical rows. They can not be accessed through
  5261.   sql.
  5262.  
  5263.   3.21) What is the meaning of some of the terms used in Postgres?
  5264.  
  5265.   Some of the source code and older documentation use terms that have more
  5266.   common usage. Here are some:
  5267.  
  5268.      * row, record, tuple
  5269.      * attribute, field, column
  5270.      * table, class
  5271.      * retrieve, select
  5272.      * replace, update
  5273.      * append, insert
  5274.      * oid, serial value
  5275.      * portal, cursor
  5276.      * range variable, table name, table alias
  5277.  
  5278.   Please let me know if you think of any more.
  5279.  
  5280.   3.22) What is Genetic Query Optimization?
  5281.  
  5282.   The GEQO module in PostgreSQL is intended to solve the query optimization
  5283.   problem of joining many tables by means of a Genetic Algorithm (GA). It
  5284.   allows the handling of large join queries through non-exhaustive search.
  5285.  
  5286.   For further information see README.GEQO <utesch@aut.tu-freiberg.de>.
  5287.  
  5288.   3.23) How do you remove a column from a table?
  5289.  
  5290.   We do not support ALTER TABLE DROP COLUMN, but do this:
  5291.  
  5292.           SELECT ...  -- select all columns but the one you want to remove
  5293.           INTO TABLE new_table
  5294.           FROM old_table;
  5295.           DROP TABLE old_table;
  5296.           ALTER TABLE new_table RENAME TO old_table;
  5297.  
  5298.   3.24) How do SELECT only the first few rows of a query?
  5299.  
  5300.   See the fetch manual page.
  5301.  
  5302.   This only prevents all row results from being transfered to the client. The
  5303.   entire query must be evaluated, even if you only want just first few rows.
  5304.   Consider a query that has and ORDER BY. There is no way to return any rows
  5305.   until the entire query is evaluated and sorted.
  5306.  
  5307.   3.25) Why can't I create a column named "time"?
  5308.  
  5309.   6.2.1 has added some new restricted keywords as we make PostgreSQL more
  5310.   ANSI-92 compilant. The next release will have this restriction removed.
  5311.   There is a patch on ftp.postgresql.org that will allow this feature now.
  5312.   ---------------------------------------------------------------------------
  5313.  
  5314.   Section 4: Extending PostgreSQL
  5315.  
  5316.   4.1) I wrote a user-defined function and when I run it in psql, it dumps
  5317.   core.
  5318.  
  5319.   The problem could be a number of things. Try testing your user-defined
  5320.   function in a stand alone test program first. Also, make sure you are not
  5321.   sending elog NOTICES when the front-end is expecting data, such as during a
  5322.   type_in() or type_out() functions
  5323.  
  5324.   4.2) I get messages of the type NOTICE:PortalHeapMemoryFree: 0x402251d0 not
  5325.   in alloc set!
  5326.  
  5327.   You are pfree'ing something that was not palloc'ed. When writing
  5328.   user-defined functions, do not include the file "libpq-fe.h". Doing so will
  5329.   cause your palloc to be a malloc instead of a free. Then, when the backend
  5330.   pfrees the storage, you get the notice message.
  5331.  
  5332.   4.3) I've written some nifty new types and functions for PostgreSQL.
  5333.  
  5334.   Please share them with other PostgreSQL users. Send your extensions to
  5335.   mailing list, and they will eventually end up in the contrib/ subdirectory.
  5336.  
  5337.   4.4) How do I write a C function to return a tuple?
  5338.  
  5339.   This requires extreme wizardry, so extreme that the authors have not ever
  5340.   tried it, though in principle it can be done. The short answer is ... you
  5341.   can't. This capability is forthcoming in the future.
  5342.  
  5343.   ---------------------------------------------------------------------------
  5344.  
  5345.   Section 5: Bugs
  5346.  
  5347.   5.1) How do I make a bug report?
  5348.  
  5349.   Check the current FAQ at http://postgreSQL.org
  5350.  
  5351.   Also check out our ftp site ftp://ftp.postgreSQL.org/pub to see if there is
  5352.   a more recent PostgreSQL version.
  5353.  
  5354.   You can also fill out the "bug-template" file and send it to:
  5355.  
  5356.      * bugs@postgreSQL.org
  5357.  
  5358.   This is the address of the developers mailing list.
  5359.  
  5360.   39.  FAQ Linux-PostgreSQL
  5361.  
  5362.   39.1.  Latest version of FAQ Linux-PostgreSQL
  5363.  
  5364.   The FAQ is included here since not all the users have the browsers
  5365.   like Netscape and Internet access. Users may use GnuInfo, Ghostview,
  5366.   vi editor or man command to read the FAQ document.  This document is
  5367.   generated in 10 different formats like GnuInfo, RTF, Plain-Text, Man
  5368.   page, Postscript etc.. and is distributed on Linux CDROMs.  Please
  5369.   refer to the latest version of FAQ which is at
  5370.   <http://www.postgresql.org/docs/faq-english.shtml> in case you have
  5371.   access to Internet."
  5372.  
  5373.   The FAQ is included here just for your convenience.
  5374.  
  5375.   39.2.  Extract of Linux FAQ from main PostgreSQL Web site
  5376.  
  5377.   If you have access to internet, please click on this URL now for
  5378.   latest version
  5379.  
  5380.   ╖  <http://www.postgresql.org/docs>
  5381.  
  5382.   =======================================================
  5383.   Frequently Asked Questions (FAQ) for PostgreSQL >= V6.1
  5384.   Linux Specific
  5385.   TO BE READ IN CONJUNCTION WITH THE NORMAL FAQ
  5386.   =======================================================
  5387.   last updated:           Wed Oct 01 11:45:00 BST 1997
  5388.  
  5389.   current maintainer:     Andrew C.R. Martin (martin@biochem.ucl.ac.uk)
  5390.   original author:        Andrew C.R. Martin (martin@biochem.ucl.ac.uk)
  5391.  
  5392.   Changes in this version (* = modified, + = new, - = removed):
  5393.  
  5394.   +3.9)   Why does Query 32 in the regression tests take so long?
  5395.  
  5396.   This file is divided approximately as follows:
  5397.   1.*)    Installing PostgreSQL
  5398.   2.*)    Compiling accessory programs
  5399.   3.*)    Runtime Problems
  5400.  
  5401.   Questions answered:
  5402.   1.1)    What changes do I need to make to src/Makefile.global or
  5403.           src/Makefile.custom and are there any other changes needed?
  5404.   1.2)    Why do I get problems with missing libreadline?
  5405.   1.3)    [REDHAT] Why do I get problems with missing libdl and dlfcn.h?
  5406.   1.4)    [SLACKWARE 3.1] Why do I get problems with missing libdl and dlfcn.h?
  5407.   1.5)    My compile of the backend dies complaining about the include file
  5408.           dlfcn.h missing
  5409.   1.6)    GCC complains about an ignored option -fpic
  5410.   1.7)    I get warnings of the form
  5411.           warning: cast from pointer to integer of different size
  5412.   1.8)    [SuSE-Linux 4.2-4.4] Where is curses and termcap?
  5413.   1.9)    Why do I get problems with ld.so?
  5414.   1.10)   Why do I get `yy_flush_buffer undefined' errors?
  5415.   1.11)   How do I compile PostgreSQL on an a.out system?
  5416.   1.12)   Why does make fail with:
  5417.           yacc -d /disk2/PostgreSQL/src/backend/parser/gram.y
  5418.           make: /usr/bin/make: cannot execute binary file
  5419.   1.13)   What are the references in X11_LIB to libsocket and libnsl in
  5420.           src/Makefile.global?
  5421.   1.14)   [DEBIAN] Where is libtermcap?
  5422.   1.15)   [REDHAT] Can I get PostgreSQL as an RPM?
  5423.   1.16)   While trying to compile a development version under Linux, compilation
  5424.           fails with a message like:
  5425.           In file included from /usr/include/sys/sem.h:8,
  5426.                    from ipc.c:37:
  5427.           /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit'
  5428.           ....
  5429.           make: *** [ipc.o] Error 1
  5430.   1.17)   When compiling postgres, gcc reports signal 11 and aborts.
  5431.   1.18)   Can I install 6.1.1 under MkLinux?
  5432.   2.1)    The linker fails to find libX11 when compiling pgtclsh
  5433.   3.1)    I get an error reporting _fUnKy_POSTPORT_sTuFf_ undefined when
  5434.           running scripts like createuser
  5435.   3.2)    I run postmaster and after that system says 'Bad system call(Core
  5436.           dumped)'
  5437.   3.3)    When I try to start the Postmaster, why do I get an error of the form
  5438.           Failed Assertion("!(file != 0):(null)", File:
  5439.           "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257)
  5440.           !(file != 0) (0)
  5441.           initdb: could not create template database
  5442.           initdb: cleaning up.
  5443.   3.4)    Why doesn't createuser work?
  5444.   3.5)    Why do I get an error like:
  5445.           IpcMemoryCreate: memKey=155356396 , size=760632 ,
  5446.           permission=384IpcMemoryCreate: shmget(..., create, ...)
  5447.           failed: Invalid argument
  5448.   3.6)    Why does psql fail with:
  5449.           psql: can't load library 'libpq.so.1'
  5450.   3.7)    Other strange behaviour
  5451.   3.8)    When PostgreSQL is running when the system is shutdown, Linux
  5452.           always fsck's the disk when rebooted.
  5453.   3.9)    Why does Query 32 in the regression tests take so long?
  5454.  
  5455.   ----------------------------------------------------------------------
  5456.   Section 1:      Compiling PostgreSQL
  5457.   ----------------------------------------------------------------------
  5458.  
  5459.   1.1)    What changes do I need to make to src/Makefile.global or
  5460.           src/Makefile.custom and are there any other changes needed?
  5461.  
  5462.           Changes to the makefiles are most easily made by running the
  5463.           customize shell script in the src directory which will write a
  5464.           Makefile.custom for you.
  5465.  
  5466.           The only other change you may have to make is to replace
  5467.           Flex if you have version 2.5.3 which has a bug which generally
  5468.           manifests itself as createuser failing (See Question 3.4)
  5469.  
  5470.           If you modify the makefiles by hand, you *must* set the
  5471.           following variable:
  5472.                   PORTNAME=       linux
  5473.  
  5474.           You will also need to change the following to match your own
  5475.           installation:
  5476.                   POSTGRESDIR
  5477.  
  5478.           If you switch on the USE_TCL option, you will need to set these:
  5479.                   TCL_INCDIR=
  5480.                   TCL_LIBDIR=
  5481.                   TCL_LIB=
  5482.                   TK_INCDIR=
  5483.                   TK_LIBDIR=
  5484.                   TK_LIB=
  5485.                   X11_INCDIR=
  5486.                   X11_LIBDIR=
  5487.                   X11_LIB=
  5488.  
  5489.           On my Slackware3.0 system, these are:
  5490.                   TCL_INCDIR=     /usr/include/tcl
  5491.                   TCL_LIBDIR=     /usr/lib
  5492.                   TCL_LIB=        -ltcl
  5493.                   TK_INCDIR=      /usr/include/tcl
  5494.                   TK_LIBDIR=      /usr/lib
  5495.                   TK_LIB=         -ltk
  5496.                   X11_INCDIR=     /usr/include/X11
  5497.                   X11_LIBDIR=     /usr/X386/lib
  5498.                   X11_LIB=        -lX11
  5499.  
  5500.           You may also make any other changes you need as documented in
  5501.           the INSTALL file and in Makefile.global
  5502.  
  5503.   1.2)    Why do I get problems with missing libreadline?
  5504.  
  5505.           Linux systems generally don't come with the GNU readline library
  5506.           installed. Either ensure you do not activate the readline options
  5507.           in src/Makefile.global or src/Makefile.custom or install the GNU
  5508.           readline library.
  5509.  
  5510.           Note that Debian Linux (like FreeBSD) does come with readline
  5511.           installed.
  5512.  
  5513.   1.3)    [REDHAT] Why do I get problems with missing libdl and dlfcn.h?
  5514.           This manifests itself as being unable to link with functions
  5515.           such as dlopen(), dlclose(), etc. during the last phase of the
  5516.           compilation.
  5517.  
  5518.           The libdl library is used for dynamic linking of user-supplied
  5519.           functions at run-time. For some reason this library was missed out
  5520.           from the Redhat distribution. It seems that the latest Redhat 4.0
  5521.           (Colgate) fixes this.
  5522.  
  5523.           RedHat now have a new ld.so RPM package on their FTP site.
  5524.           Simply grab:
  5525.  
  5526.                   ftp://ftp.redhat.com/pub/redhat/devel/i386/RedHat/RPMS/ld.so-1.7.14-4.i386.rpm
  5527.  
  5528.           Install the RPM file in the usual way and off you go!
  5529.  
  5530.           There has been one report of a corrupted system resulting from
  5531.           programs accessing these libraries while updating them (not
  5532.           altogether surprising). Consequently it is a good idea to reboot
  5533.           the system before installing the new libraries and to
  5534.           have as little running as possible during this upgrade. Going
  5535.           into single-user mode is probably a good idea!
  5536.  
  5537.           If you want to do it the hard way, you can obtain the library and the
  5538.           header file from:
  5539.  
  5540.                   ftp://tsx-11.mit.edu/pub/linux/packages/GCC/ld.so-1.7.14.tar.gz
  5541.  
  5542.           Alternatively, you may find precompiled binaries in
  5543.           distributions/debian/buzz/binary-i386/base/ld.so-1.7.14-4.deb
  5544.           on the same site, or follow the instructions given for question 1.2 for
  5545.           correcting the same error with early releases of Slackware 3.1.
  5546.           Don't use this method unless you know what you are doing!
  5547.  
  5548.   1.4)    [SLACKWARE 3.1] Why do I get problems with missing libdl and dlfcn.h?
  5549.  
  5550.           This manifests itself as being unable to link with functions
  5551.           such as dlopen(), dlclose(), etc. during the last phase of the
  5552.           compilation.
  5553.  
  5554.           See the answer to question 1.3. Slackware up to version 3.0 was
  5555.           supplied with this library and include file and they seem to be
  5556.           back in again in the latest versions of 3.1, but the early 3.1
  5557.           releases (before 9th September 1996) had them missing and many
  5558.           CD-ROM versions will have been pressed from the first 3.1 releases.
  5559.  
  5560.           There has been one report of a corrupted system resulting from
  5561.           programs accessing these libraries while updating them (not
  5562.           altogether surprising). Consequently it is a good idea to reboot
  5563.           the system before installing the new libraries and to
  5564.           have as little running as possible during this upgrade. Going
  5565.           into single-user mode is probably a good idea!
  5566.  
  5567.           The easiest fix is to obtain the file ldso.tgz from the a4 disk of
  5568.           a more recent Slackware 3.1 distribution and unpack this file
  5569.           from the root (/) directory, then do
  5570.  
  5571.                   sh install/doinst.sh
  5572.  
  5573.           to complete the installation. Follow this with
  5574.  
  5575.                   ldconfig
  5576.  
  5577.           If you want to install manually, you must first install the file
  5578.           dlfcn.h in /usr/include.
  5579.  
  5580.           Second, install the file libdl.so.1.7.14 (or whatever the latest
  5581.           release is) in /lib, then do:
  5582.  
  5583.                   cd /lib
  5584.                   ln -sf libdl.so.1.7.14 libdl.so.1
  5585.                   ln -sf libdl.so.1 libdl.so
  5586.  
  5587.           On some systems (depending on your GCC configuration) it may be
  5588.           necessary to do:
  5589.  
  5590.                   cd /usr/lib
  5591.                   ln -sf /lib/libdl.so .
  5592.  
  5593.           Finally
  5594.  
  5595.                   ldconfig
  5596.  
  5597.   1.5)    My compile of the backend dies complaining about the include file
  5598.           dlfcn.h missing
  5599.  
  5600.           See the answer to question 1.3/1.4. Don't forget that if you are using
  5601.           an a.out system you must first have installed the dld package
  5602.           (which is not supplied with most a.out systems) to have dlfcn.h
  5603.           at all. See Question 1.11.
  5604.  
  5605.   1.6)    GCC complains about an ignored option -fpic
  5606.  
  5607.           Earlier versions of GCC accepted either -fpic or -fPIC.
  5608.           It appears that more recent versions (V2.7.2?) require -fPIC.
  5609.           If you are using an ELF version of Linux, this can safely be
  5610.           ignored as -fPIC is the default.
  5611.  
  5612.           You can correct this by editing src/Makefile.global and
  5613.           changing CFLAGS_SL
  5614.  
  5615.   1.7)    I get warnings of the form
  5616.           warning: cast from pointer to integer of different size
  5617.  
  5618.           These were seen in earlier versions of Postgres95 and could
  5619.           safely be ignored. PostgreSQL V6.0 should compile with no warnings
  5620.           except those related to system header files (which can also
  5621.           be safely ignored).
  5622.  
  5623.   1.8)    [SuSE-Linux 4.2-4.4] Where is curses and termcap?
  5624.  
  5625.           SuSE-Linux 4.2 has ncurses but not curses. 4.4 appears to have both.
  5626.           SuSE-Linux also has the termcap library is in /usr/lib/termcap
  5627.           instead of in /usr/lib.
  5628.  
  5629.           PostgreSQL (up to V6.0)
  5630.           -----------------------
  5631.           Set the value of CURSES_LIB in src/Makefile.custom to -lncurses
  5632.           (or do this through the customize script).
  5633.           Add the following line to src/Makefile.custom:
  5634.  
  5635.                   LDADD_BE+= -L/usr/lib/termcap
  5636.  
  5637.           You may need to edit src/bin/psql/Makefile and change:
  5638.                   ifeq ($(PORTNAME), linux)
  5639.                      LD_ADD+=
  5640.           to:
  5641.                   ifeq ($(PORTNAME), linux)
  5642.                      LD_ADD+= -ltermcap
  5643.  
  5644.           PostgreSQL (V6.1)
  5645.           -----------------
  5646.           The configure script doesn't know to look in /usr/lib/termcap for
  5647.           the termcap library, so you should specify this as one of the
  5648.           library directories when asked for additional directories to
  5649.           search.
  5650.  
  5651.           If this doesn't work (I don't have SuSE to verify that it does)
  5652.           then after running configure, you need to edit
  5653.           src/Makefile.global and add -ltermcap to the LDFLAGS line
  5654.           (after -lreadline).
  5655.  
  5656.           You may also wish to force use of ncurses rather than curses by
  5657.           changing -lcurses to -lncurses.
  5658.  
  5659.   1.9)    Why do I get problems with ld.so?
  5660.  
  5661.           If you get problems with ld.so, another library required under
  5662.           ELF for dynamic loading, then you have messed up your installation
  5663.           or (more likely) upgrade of Linux.
  5664.  
  5665.           See the answers to Question 1.3/1.4. You may need to install
  5666.           ld.so.x.y.z in /lib and run ldconfig.
  5667.  
  5668.           The most recent stable release of the ld package is 1.7.14
  5669.           At the time of writing, 1.8.x versions of ld are experimental.
  5670.  
  5671.   1.10)   Why do I get `yy_flush_buffer undefined' errors?
  5672.  
  5673.           This isn't really Linux specific, but is common on older Linux
  5674.           installations. You must have a recent version of flex (2.5.2 or later)
  5675.           to compile PostgreSQL. Note that flex 2.5.3 has a bug: see
  5676.           Question 3.4.
  5677.  
  5678.   1.11)   How do I compile PostgreSQL on an a.out system?
  5679.  
  5680.           First, you must install the dld library. This may be obtained
  5681.           from Sunsite as:
  5682.           Linux/libs/dld.3.2.7.tar.gz
  5683.           (ftp://sunsite.unc.edu/pub/Linux/libs/dld.3.2.7.tar.gz)
  5684.  
  5685.           Second, add the following line to src/Makefile.custom:
  5686.                   LINUX_ELF=
  5687.           (or use the customize script)
  5688.  
  5689.   1.12)   Why does make fail with:
  5690.           yacc -d /disk2/PostgreSQL/src/backend/parser/gram.y
  5691.           make: /usr/bin/make: cannot execute binary file
  5692.  
  5693.           This was a problem in earlier versions of Postgres95. The default
  5694.           for PostgreSQL is to use bison -y rather than yacc.
  5695.  
  5696.           yacc is generally implemented as a script which invokes bison -y
  5697.           For some reason (certain versions of make? certain versions of
  5698.           bash?) make is unable to execute this script file.
  5699.  
  5700.           To correct this, simply edit src/mk/port/postgres.mk.linux
  5701.           and, at the end of the file, change:
  5702.                   # YACC = bison -y
  5703.           to
  5704.                   YACC = bison -y
  5705.  
  5706.   1.13)   What are the references in X11_LIB to libsocket and libnsl in
  5707.           src/Makefile.global?
  5708.  
  5709.           This was a problem in 1.08 (they are Sun Solaris specific).
  5710.           It is fixed in 1.09 and 6.0
  5711.  
  5712.   1.14)   [DEBIAN] Where is libtermcap?
  5713.  
  5714.           Debian Linux comes without the termcap library and uses ncurses
  5715.           (which uses terminfo instead). There is no need to change the
  5716.           CURSES_LIB variable in src/bin/psql/Makefile since Debian provides
  5717.           a link from libncurses to libcurses (unlike SuSE-Linux --- see
  5718.           Question 1.8).
  5719.  
  5720.           You may need to edit src/bin/psql/Makefile and comment out the
  5721.           change:
  5722.                   ifeq ($(PORTNAME), linux)
  5723.                      LD_ADD+= -ltermcap
  5724.           to:
  5725.                   ifeq ($(PORTNAME), linux)
  5726.                      LD_ADD+=
  5727.  
  5728.   1.15)   [REDHAT] Can I get PostgreSQL as an RPM?
  5729.  
  5730.           Yes! Michal Mosiewicz
  5731.           (http://www.pdi.lodz.pl/~mimo) has kindly put together an RPM
  5732.           for PostgreSQL V6.0 on Intel architectures which he has uploaded to
  5733.           ftp://ftp.redhat.org/pub/Incoming/Postgres-6.0-1.i386.rpm
  5734.  
  5735.           This is a pre-compiled version, the source RPM is on its
  5736.           was as I write (3rd Feb 1997).
  5737.  
  5738.   1.16)   While trying to compile a development version under Linux, compilation
  5739.           fails with a message like:
  5740.           In file included from /usr/include/sys/sem.h:8,
  5741.                    from ipc.c:37:
  5742.           /usr/include/asm/bitops.h:32: warning: no previous prototype for Set_bit'
  5743.           ....
  5744.           make: *** [ipc.o] Error 1
  5745.  
  5746.           The problem is that Linux provides no prototypes for these
  5747.           inline functions. The solution is to go into the
  5748.           .../src/backend/storage/ipc directory and edit the Makefile.
  5749.           Change the line
  5750.              CFLAGS+=$(INCLUDE_OPT)
  5751.           to
  5752.              CFLAGS+=$(INCLUDE_OPT) -Wno-error
  5753.  
  5754.           Do the same in the ../src/backend/storage/lmgr directory.
  5755.  
  5756.   1.17)   When compiling postgres, gcc reports signal 11 and aborts.
  5757.           More specifically:
  5758.              gcc: Internal compiler error: program cc1 got fatal
  5759.                   signal 11
  5760.  
  5761.           This may be a hardware/memory problem. PortgreSQL is a big
  5762.           program, and large gcc compilations (such as building
  5763.           PostgreSQL or bebuilding the kernel) stress memory like
  5764.           few other programs, resulting in errors that do not occur
  5765.           in normal operation. Lesser operating systems are also
  5766.           unlikely to stress the hardware to this degree so you
  5767.           may never see any problems under DOS/Windows.
  5768.  
  5769.           More information on this problem at:
  5770.              http://www.bitwizard.nl/sig11
  5771.  
  5772.   1.18)   Can I install 6.1.1 under MkLinux?
  5773.  
  5774.           Tatsuo Ishii  has done this under
  5775.           MkLinux DR2.1 update2 after a small patch available from:
  5776.           ftp://ftp.sra.co.jp/pub/cmd/postgres/6.1.1/mklinux.patch.gz
  5777.  
  5778.   ----------------------------------------------------------------------
  5779.   Section 2:      Compiling accessory programs
  5780.   ----------------------------------------------------------------------
  5781.  
  5782.   2.1)    The linker fails to find libX11 when compiling pgtclsh
  5783.  
  5784.           Add the following to src/Makefile.custom
  5785.                   X11_LIBDIR = /usr/X11R6/lib
  5786.  
  5787.   ----------------------------------------------------------------------
  5788.   Section 3:      Runtime Problems
  5789.   ----------------------------------------------------------------------
  5790.  
  5791.   3.1)    I get an error reporting _fUnKy_POSTPORT_sTuFf_ undefined when
  5792.           running scripts like createuser
  5793.  
  5794.           This is a bug in V1.06-V1.07 of Postgres and is fixed in V1.08
  5795.           and above.
  5796.  
  5797.   3.2)    I run postmaster and after that system says 'Bad system call(Core
  5798.           dumped)'
  5799.  
  5800.           This indicates that you have not compiled shared memory support
  5801.           into your kernel. You need to recompile the Linux kernel to add this
  5802.           feature.
  5803.  
  5804.   3.3)    When I try to start the Postmaster, why do I get an error of the form
  5805.           Failed Assertion("!(file != 0):(null)", File:
  5806.           "/usr/local/PostgreSQL/src/backend/storage/file/fd.c", Line: 257)
  5807.           !(file != 0) (0)
  5808.           initdb: could not create template database
  5809.           initdb: cleaning up.
  5810.  
  5811.           Your permissions on the file /dev/null are wrong.
  5812.  
  5813.           ls -l /dev/null should give you something like:
  5814.  
  5815.                   crw-rw-rw-  1 root  wheel    2,   2 Oct  8 18:41 /dev/null
  5816.  
  5817.           Correct the permissions using:
  5818.  
  5819.                   chmod a+rw /dev/null
  5820.  
  5821.   3.4)    Why doesn't createuser work?
  5822.  
  5823.           There is a problem with Version 2.5.3 of GNU flex and createuser.
  5824.           Your options are to downgrade flex to V2.5.2, upgrade to V2.5.4
  5825.           or apply a patch to V2.5.3 which is supplied in doc/README.flex
  5826.           You may obtain V2.5.4 from
  5827.           ftp://prep.ai.mit.edu/pub/gnu/flex-2.5.4.tar.gz
  5828.  
  5829.   3.5)    Why do I get an error like:
  5830.           IpcMemoryCreate: memKey=155356396 , size=760632 ,
  5831.           permission=384IpcMemoryCreate: shmget(..., create, ...)
  5832.           failed: Invalid argument
  5833.  
  5834.           You haven't build IPC support into your Linux kernel. You
  5835.           will have to rebuild the kernel and switch on this option.
  5836.  
  5837.   3.6)    Why does psql fail with:
  5838.           psql: can't load library 'libpq.so.1'
  5839.  
  5840.           Psql has been compiled to link dynamically with the libpq
  5841.           library.
  5842.  
  5843.           To solve this, you should log in as root and edit the file
  5844.                   /etc/ld.so.conf
  5845.           Add a single line at the end which gives the name of the
  5846.           PostgreSQL library directory (the lib subdirectory of your
  5847.           PostgreSQL installation) and run
  5848.                   /sbin/ldconfig -v
  5849.  
  5850.           Alternatively, (and if you don't have root access), you may
  5851.           use the LD_LIBRARY_PATH environment variable.
  5852.  
  5853.           The LD_LIBRARY_PATH variable contains a colon separated list of
  5854.           paths to be searched for shared libraries.  This list is
  5855.           searched before the libraries specified by ldconfig.
  5856.  
  5857.           Therefore under Bash, you would do something like:
  5858.                   export LD_LIBRARY_PATH='PathToPGSQL'/lib
  5859.           or, using tcsh
  5860.                   setenv LD_LIBRARY_PATH 'PathToPGSQL'/lib
  5861.           replacing 'PathToPGSQL' with the appropriate path to your top level
  5862.           PostgreSQL directory
  5863.  
  5864.           Note that the ldd command can be used on a dynamically linked
  5865.           executable to list the paths to all the shared libraries upon
  5866.           which the executable depends.
  5867.  
  5868.   3.7)    Other strange behaviour
  5869.  
  5870.           I'm not sure what the symptoms might be except for nothing
  5871.           working properly, but it has been pointed out that one needs
  5872.           to be careful that the dynamic loader loads the correct version
  5873.           of the libpq library. If you have old versions lying around
  5874.           in your library path (for example in /usr/lib) these may get
  5875.           loaded instead of the new version you intended to load. Make
  5876.           sure you get them out of the way and look at Q3.6 for
  5877.           details of loading libraries.
  5878.  
  5879.   3.8)    When PostgreSQL is running when the system is shutdown, Linux
  5880.           always fsck's the disk when rebooted.
  5881.  
  5882.           There have been some reports of this happening and it seems
  5883.           to be a result of running PostgreSQL from /etc/inittab as
  5884.           suggested in the INSTALL document.
  5885.  
  5886.           You are therefore recommended to start the postmaster from an
  5887.           rc script. Under a Slackware-like release, you would modify
  5888.           /etc/rc.d/rc.local to start the postmaster. Under a RedHat-like
  5889.           release you should create a SysV style script in
  5890.           /etc/rc.d/rc3.d based on the /etc/rc.d/init.d skeleton file.
  5891.  
  5892.           There's a sample file in contrib/linux/postgres.init
  5893.  
  5894.           Here's another sample file supplied by John Robinson
  5895.            which you should modify as needed:
  5896.  
  5897.   #!/bin/sh
  5898.   #
  5899.   # postgreSQL.init This shell script takes care of starting and stopping
  5900.   #               the PostgreSQL postmaster.
  5901.   #
  5902.  
  5903.   # Source function library.
  5904.   \&. /etc/rc.d/init.d/functions
  5905.  
  5906.   # Source networking configuration.
  5907.   \&. /etc/sysconfig/network
  5908.  
  5909.   # Check that networking is up.
  5910.   [ $(NETWORKING) = "no" ] && exit 0
  5911.  
  5912.   # See how we were called.
  5913.   case "$1" in
  5914.     start)
  5915.           # Start daemons.
  5916.           echo -n "Starting postgres Postmaster daemon:"
  5917.           if [ -z "`pidofproc postmaster`" ]
  5918.           then
  5919.                   su postgres -c "/usr/local/pgsql/bin/postmaster -D /home/postgreSQL/data -p 5432 &"
  5920.                   echo -n " postmaster"
  5921.           else
  5922.                   echo -n " (already running)"
  5923.           fi
  5924.           echo
  5925.           touch /var/lock/subsys/postgres
  5926.           ;;
  5927.     stop)
  5928.           # Stop daemons.
  5929.           echo -n "Shutting down postgres Postmaster daemon: "
  5930.           killall -TERM postmaster 2>/dev/null
  5931.           killall -TERM postgres 2>/dev/null
  5932.           echo
  5933.           rm -f /var/lock/subsys/postgres
  5934.           ;;
  5935.     *)
  5936.           echo "Usage: postgres (start|stop)"
  5937.           exit 1
  5938.   esac
  5939.  
  5940.   exit 0
  5941.  
  5942.   3.9)    Why does Query 32 in the regression tests take so long?
  5943.  
  5944.           This is due to a bug in regression scripts which only happens
  5945.           on linux boxes. There are two workarounds as far as I know
  5946.           (information from Tatsuo Ishii ):
  5947.  
  5948.           1. change following in regress.sh:
  5949.                   time postgres -texecutor -tplanner -Q bench < bench.sql
  5950.           to:
  5951.                   postgres -texecutor -tplanner -Q bench < bench.sql
  5952.  
  5953.           2. after running the test, remove a line at the very end of
  5954.           bench.out something like:
  5955.                   85.86user 114.47system 4:49.20elapsed 69%CPU (0avgtext+0avgdata 0maxresident)k
  5956.           then type:
  5957.                   sh ./perquery < bench.out > & bench.out.perquery
  5958.  
  5959.   ----------------------------------------------------------------------------
  5960.   Dr. Andrew C.R. Martin                             University College London
  5961.   EMAIL: (Work) martin@biochem.ucl.ac.uk    (Home) andrew@stagleys.demon.co.uk
  5962.   URL:   http://www.biochem.ucl.ac.uk/~martin
  5963.   Tel:   (Work) +44(0)171 419 3890                    (Home) +44(0)1372 275775
  5964.  
  5965.   40.  FAQ IRIX-PostgreSQL
  5966.  
  5967.   40.1.  Latest version of FAQ IRIX-PostgreSQL
  5968.  
  5969.   The FAQ is included here since not all the users have the browsers
  5970.   like Netscape and Internet access. Users may use GnuInfo, Ghostview,
  5971.   vi editor or man command to read the FAQ document.  This document is
  5972.   generated in 10 different formats like GnuInfo, RTF, Plain-Text, Man
  5973.   page, Postscript etc.. and is distributed on Linux CDROMs.  Please
  5974.   refer to the latest version of FAQ which is at
  5975.   <http://www.postgresql.org/docs/faq-english.shtml> in case you have
  5976.   access to Internet."
  5977.  
  5978.   The FAQ is included here just for your convenience.
  5979.  
  5980.   40.2.  Extract of IRIX FAQ from main PostgreSQL Web site
  5981.  
  5982.   If you have access to internet, please click on this URL now for the
  5983.   latest version
  5984.  
  5985.   ╖  <http://www.postgresql.org/docs>
  5986.  
  5987.   ======================================================
  5988.   Frequently Asked Questions (FAQ) for PostgreSQL >=V6.1
  5989.   IRIX Specific
  5990.   TO BE READ IN CONJUNCTION WITH THE NORMAL FAQ
  5991.   ======================================================
  5992.   last updated:           Mon Dec 04 10:20:00 GMT 1997
  5993.  
  5994.   current maintainer:     Andrew C.R. Martin (martin@biochem.ucl.ac.uk)
  5995.   original author:        Andrew C.R. Martin (martin@biochem.ucl.ac.uk)
  5996.  
  5997.   Changes in this version (* = modified, + = new, - = removed):
  5998.   +1.9)   Why does IRIX5 lex fail with PostgreSQL 6.2.1?
  5999.  
  6000.   This file is divided approximately as follows:
  6001.   1.*)    Installing PostgreSQL
  6002.   2.*)    Uninstalling PostgreSQL
  6003.   3.*)    Extending PostgreSQL
  6004.  
  6005.   Questions answered:
  6006.   1.1)    What extra items do I need to install PostgreSQL under Irix?
  6007.   1.2)    What changes do I need to make to src/Makefile.global?
  6008.   1.3)    What are the references in X11_LIB to libsocket and libnsl in
  6009.           src/Makefile.global?
  6010.   1.4)    Are there any other changes I should make?
  6011.   1.5)    Can I install PostgreSQL under Irix 6.x?
  6012.   1.6)    The make fails with the following message:
  6013.           ld32: ERROR 4: Conflicting flag setting: -call_shared
  6014.   1.7)    Why won't it link? (Problems with lorder)
  6015.   1.8)    I have major problems with IRIX 6!
  6016.   1.9)    Why does lex fail with PostgreSQL 6.2.1?
  6017.   2.1)    Why can't I move the executable files?
  6018.   3.1)    How do I compile a C program to create a function for extending
  6019.           PostgreSQL
  6020.  
  6021.   ----------------------------------------------------------------------
  6022.   Section 1:      Installing PostgreSQL
  6023.   ----------------------------------------------------------------------
  6024.  
  6025.   1.1)    What extra items do I need to install PostgreSQL under Irix?
  6026.  
  6027.           You *must* have the following installed:
  6028.           a) Gnu make (installed as gmake)
  6029.  
  6030.           You are recommended to install the following:
  6031.           a) GNU install (installed as ginstall)
  6032.              (This is part of the GNU fileutils package)
  6033.  
  6034.           You may choose to install the following:
  6035.           a) GNU readline library (if you wish psql to have readline
  6036.              support).
  6037.           b) tcl/tk (if you wish to compile pgtclsh)
  6038.  
  6039.   1.2)    What changes do I need to make to src/Makefile.global or
  6040.           src/Makefile.custom?
  6041.  
  6042.           The easiest way to do this is to use the customize script in
  6043.           the src directory.
  6044.  
  6045.           You *must* set the following variables:
  6046.                   PORTNAME=       irix5
  6047.  
  6048.           You will also need to change the following to match your own
  6049.           installation:
  6050.                   POSTGRESDIR
  6051.  
  6052.           If you switch on the USE_TCL option, you will need to set these:
  6053.                   TCL_INCDIR=
  6054.                   TCL_LIBDIR=
  6055.                   TCL_LIB =
  6056.                   TK_INCDIR=
  6057.                   TK_LIBDIR=
  6058.                   TK_LIB =
  6059.  
  6060.           You may also make any other changes you need as documented in
  6061.           the INSTALL file and in Makefile.global
  6062.  
  6063.   1.3)    What are the references in X11_LIB to libsocket and libnsl in
  6064.           src/Makefile.global?
  6065.  
  6066.           This was a problem in 1.08 (they are Sun Solaris specific).
  6067.           It is fixed in 1.09 and above.
  6068.  
  6069.   1.4)    Are there any other changes I should make?
  6070.  
  6071.           If you have installed the GNU install program (ginstall), you
  6072.           should add the following line to src/Makefile.custom:
  6073.                   CUSTOM_INSTALL=ginstall
  6074.  
  6075.           For an explanation as to why this is a good idea, see Question 2.1
  6076.           Ginstall is part of the GNU fileutils package.
  6077.  
  6078.   1.5)    Can I install PostgreSQL under Irix 6.x?
  6079.  
  6080.           Irix 6.2-6.4 has a bug in ld which mishandles the addresses of
  6081.           static procedures when object files are assembled into
  6082.           larger object files using 'ld -r'. This bug has been reported
  6083.           to Silicon Graphics.
  6084.  
  6085.           One option is to use the Gnu version of ld. Alternatively,
  6086.           the following patch should be applied as a workaround.
  6087.           (Supplied by Bob Bruccoleri )
  6088.  
  6089.   *** ./backend/Makefile.orig     Thu May 22 00:00:15 1997
  6090.   --- ./backend/Makefile  Thu Jun  5 16:47:27 1997
  6091.   ***************
  6092.   *** 54,60 ****
  6093.     all: postgres $(POSTGRES_IMP) global1.bki.source local1_template1.bki.source
  6094.  
  6095.     postgres: $(OBJS) ../utils/version.o
  6096.   !       $(CC) -o postgres $(OBJS) ../utils/version.o $(LDFLAGS)
  6097.  
  6098.     $(OBJS): $(DIRS:%=%.dir)
  6099.  
  6100.   --- 54,64 ----
  6101.     all: postgres $(POSTGRES_IMP) global1.bki.source local1_template1.bki.source
  6102.  
  6103.     postgres: $(OBJS) ../utils/version.o
  6104.   ! #     $(CC) -o postgres $(OBJS) ../utils/version.o $(LDFLAGS)
  6105.   !       -rm -f *.o
  6106.   !       find . -name "*.o" -exec cp \(\) . \;
  6107.   !       rm -f SUBSYS.o
  6108.   !       $(CC) -o postgres *.o ../utils/version.o $(LDFLAGS)
  6109.  
  6110.     $(OBJS): $(DIRS:%=%.dir)
  6111.  
  6112.   1.6)    The make fails with the following message:
  6113.           ld32: ERROR 4: Conflicting flag setting: -call_shared
  6114.  
  6115.           If gmake fails in .../src/backend while building obj/ACCESS.o
  6116.           with a message from ld32, you can work around this by using
  6117.           ld for the LD environment variable rather than cc.
  6118.  
  6119.           The problem has been observed under Irix 5.3 when compiling both
  6120.           Postgres95-1.09 and PostgreSQL-6.2Beta6, but on some systems
  6121.           these appear to compile with no such problems.
  6122.  
  6123.           Fix supplied by Brian Sanders (bsanders@netcom.com,
  6124.           brian@fresnelsoft.com)
  6125.  
  6126.   1.7)    Why won't it link? (Problems with lorder)
  6127.  
  6128.           According to the IRIX man pages, lorder is useless, but harmless
  6129.           under IRIX. However, it has caused problems for some people
  6130.           using both IRIX 6.2.
  6131.  
  6132.           The solution is to add the following line to
  6133.           .../src/makefiles/Makefile.irix5
  6134.  
  6135.           MK_NO_LORDER=true
  6136.  
  6137.   1.8)    I have major problems with IRIX 6!
  6138.  
  6139.           The following is quoted directly from Bob Bruccoleri
  6140.  
  6141.   There is a really nasty loader bug in the compiler system (7.1)
  6142.   on Irix 6.x, and the error that Lasse Petersen is the result of it.
  6143.   Here is the original message. I don't know if all the changes have been
  6144.   folded into the current release.
  6145.  
  6146.   Date: Fri, 06 Jun 1997 17:12:20 -0400 (EDT)
  6147.   From: bruc@bms.com (Robert Bruccoleri)
  6148.   Subject: [PORTS] Patches for Irix 6.4
  6149.  
  6150.   I have worked out how to compile PostgreSQL on Irix 6.4 using the -n32 compiler
  6151.   mode and version 7.1 of the C compiler. (The n32 compiler use 32 bits addressing,
  6152.   but allows access to all the instructions in the MIPS4 instruction set.)
  6153.   There were several problems:
  6154.  
  6155.   1) The ld command is not referenced as a macro in all the Makefiles. On
  6156.   this platform, you have to include -n32 on all the ld commands. Makefiles
  6157.   were changed as needed.
  6158.  
  6159.   2) There is a bug in "ld" which mishandles the addresses of static procedures
  6160.   when object files are assembled into larger object files using "ld -r".
  6161.   Because of this, I put a hack into src/backend/Makefile to avoid all the
  6162.   SUBSYS.o files and just link all the objects. I have contacted SGI about the
  6163.   problem, and hopefully, it will be fixed in the near future.
  6164.  
  6165.   3) Lots of warnings are generated from the compiler. Since the regression
  6166.   tests worked OK, I didn't attempt to fix them. If anyone wants the compilation
  6167.   log, please let me know, and I'll email it to you.
  6168.  
  6169.   The version of postgresql was 970602. Here is Makefile.custom:
  6170.  
  6171.   CUSTOM_COPT = -O2 -n32
  6172.   MK_NO_LORDER = 1
  6173.   LD = ld -n32
  6174.   CC += -n32
  6175.  
  6176.   Here are the patches:
  6177.  
  6178.   *** ./backend/access/Makefile.orig      Sun Nov 10 00:00:15 1996
  6179.   - --- ./backend/access/Makefile Tue Jun  3 10:22:32 1997
  6180.   ***************
  6181.   *** 8,13 ****
  6182.   - --- 8,16 ----
  6183.     #
  6184.     #-------------------------------------------------------------------------
  6185.   + SRCDIR = ../..
  6186.   + include ../../Makefile.global
  6187.   +
  6188.     OBJS = common/SUBSYS.o gist/SUBSYS.o hash/SUBSYS.o heap/SUBSYS.o \
  6189.            index/SUBSYS.o rtree/SUBSYS.o nbtree/SUBSYS.o transam/SUBSYS.o
  6190.  
  6191.   *** ./backend/bootstrap/Makefile.orig   Fri Apr 18 06:00:23 1997
  6192.   - --- ./backend/bootstrap/Makefile      Tue Jun  3 10:23:59 1997
  6193.   ***************
  6194.   *** 38,44 ****
  6195.     all: SUBSYS.o
  6196.  
  6197.     SUBSYS.o: $(OBJS)
  6198.   !       ld -r -o SUBSYS.o $(OBJS)
  6199.  
  6200.     # bootstrap.o's dependency on bootstrap_tokens.h is computed by the
  6201.     # make depend, but we state it here explicitly anyway because
  6202.   - --- 38,44 ----
  6203.     all: SUBSYS.o
  6204.  
  6205.     SUBSYS.o: $(OBJS)
  6206.   !       $(LD) -r -o SUBSYS.o $(OBJS)
  6207.  
  6208.     # bootstrap.o's dependency on bootstrap_tokens.h is computed by the
  6209.     # make depend, but we state it here explicitly anyway because
  6210.  
  6211.   *** ./backend/Makefile.orig     Thu May 22 00:00:15 1997
  6212.   - --- ./backend/Makefile        Thu Jun  5 16:47:27 1997
  6213.   ***************
  6214.   *** 54,60 ****
  6215.     all: postgres $(POSTGRES_IMP) global1.bki.source local1_template1.bki.source
  6216.  
  6217.     postgres: $(OBJS) ../utils/version.o
  6218.   !       $(CC) -o postgres $(OBJS) ../utils/version.o $(LDFLAGS)
  6219.  
  6220.     $(OBJS): $(DIRS:%=%.dir)
  6221.  
  6222.   - --- 54,64 ----
  6223.     all: postgres $(POSTGRES_IMP) global1.bki.source local1_template1.bki.source
  6224.  
  6225.     postgres: $(OBJS) ../utils/version.o
  6226.   ! #     $(CC) -o postgres $(OBJS) ../utils/version.o $(LDFLAGS)
  6227.   !       -rm -f *.o
  6228.   !       find . -name "*.o" -exec cp \(\) . \;
  6229.   !       rm -f SUBSYS.o
  6230.   !       $(CC) -o postgres *.o ../utils/version.o $(LDFLAGS)
  6231.  
  6232.     $(OBJS): $(DIRS:%=%.dir)
  6233.  
  6234.   ***************
  6235.   *** 116,122 ****
  6236.     install: $(LIBDIR) $(BINDIR) $(HEADERDIR) postgres $(POSTGRES_IMP) fmgr.h\
  6237.              global1.bki.source local1_template1.bki.source \
  6238.              libpq/pg_hba.conf.sample optimizer/geqo/pg_geqo.sample
  6239.   !
  6240.           $(INSTALL) $(INSTL_EXE_OPTS) postgres $(BINDIR)/postgres
  6241.     ifeq ($(MAKE_EXPORTS), true)
  6242.           $(INSTALL) $(INSTLOPTS) $(POSTGRES_IMP) $(LIBDIR)/$(POSTGRES_IMP)
  6243.   - --- 120,126 ----
  6244.     install: $(LIBDIR) $(BINDIR) $(HEADERDIR) postgres $(POSTGRES_IMP) fmgr.h\
  6245.              global1.bki.source local1_template1.bki.source \
  6246.              libpq/pg_hba.conf.sample optimizer/geqo/pg_geqo.sample
  6247.   !
  6248.           $(INSTALL) $(INSTL_EXE_OPTS) postgres $(BINDIR)/postgres
  6249.     ifeq ($(MAKE_EXPORTS), true)
  6250.           $(INSTALL) $(INSTLOPTS) $(POSTGRES_IMP) $(LIBDIR)/$(POSTGRES_IMP)
  6251.   *** ./backend/optimizer/Makefile.orig   Wed Feb 19 12:00:34 1997
  6252.   - --- ./backend/optimizer/Makefile      Tue Jun  3 10:39:47 1997
  6253.   ***************
  6254.   *** 8,13 ****
  6255.   - --- 8,16 ----
  6256.     #
  6257.     #-------------------------------------------------------------------------
  6258.  
  6259.   + SRCDIR= ../..
  6260.   + include ../../Makefile.global
  6261.   +
  6262.     all: submake SUBSYS.o
  6263.  
  6264.     OBJS = path/SUBSYS.o plan/SUBSYS.o prep/SUBSYS.o util/SUBSYS.o geqo/SUBSYS.o
  6265.  
  6266.   *** ./backend/libpq/pqcomprim.c.orig    Mon May 26 00:00:23 1997
  6267.   - --- ./backend/libpq/pqcomprim.c       Fri Jun  6 16:02:24 1997
  6268.   ***************
  6269.   *** 32,40 ****
  6270.     #    define hton_l(n) (ntoh_l(n))
  6271.     #  else       /* BYTE_ORDER != BIG_ENDIAN */
  6272.     #    if BYTE_ORDER == PDP_ENDIAN
  6273.   ! #      #error PDP_ENDIAN macros not written yet
  6274.     #    else     /* BYTE_ORDER !=  anything known */
  6275.   ! #      #error BYTE_ORDER not defined as anything understood
  6276.     #    endif    /* BYTE_ORDER == PDP_ENDIAN */
  6277.     #  endif      /* BYTE_ORDER == BIG_ENDIAN */
  6278.     #endif                /* BYTE_ORDER == LITTLE_ENDIAN */
  6279.   - --- 32,40 ----
  6280.     #    define hton_l(n) (ntoh_l(n))
  6281.     #  else       /* BYTE_ORDER != BIG_ENDIAN */
  6282.     #    if BYTE_ORDER == PDP_ENDIAN
  6283.   ! #      error PDP_ENDIAN macros not written yet
  6284.     #    else     /* BYTE_ORDER !=  anything known */
  6285.   ! #      error BYTE_ORDER not defined as anything understood
  6286.     #    endif    /* BYTE_ORDER == PDP_ENDIAN */
  6287.     #  endif      /* BYTE_ORDER == BIG_ENDIAN */
  6288.     #endif                /* BYTE_ORDER == LITTLE_ENDIAN */
  6289.  
  6290.   *** ./backend/storage/Makefile.orig     Sun Nov 10 00:01:06 1996
  6291.   - --- ./backend/storage/Makefile        Tue Jun  3 10:41:29 1997
  6292.   ***************
  6293.   *** 8,13 ****
  6294.   - --- 8,16 ----
  6295.     #
  6296.     #-------------------------------------------------------------------------
  6297.  
  6298.   + SRCDIR= ../..
  6299.   + include ../../Makefile.global
  6300.   +
  6301.     all: submake SUBSYS.o
  6302.  
  6303.     OBJS = buffer/SUBSYS.o file/SUBSYS.o ipc/SUBSYS.o large_object/SUBSYS.o \
  6304.  
  6305.   1.9)    Why does lex fail with PostgreSQL 6.2.1?
  6306.  
  6307.           IRIX 5.3 lex has been reported to fail in
  6308.           postgresql-6.2.1/src/backend/parser with the error:
  6309.  
  6310.           lex scan.l
  6311.           "scan.l":line 86: Error: Invalid request %x xc
  6312.           gmake[2]: *** [scan.c] Error 1
  6313.  
  6314.           The answer is to use GNU flex 2.5.4 or later. Use the command
  6315.              flex --version
  6316.           to check you have a new enough version of flex
  6317.   ----------------------------------------------------------------------
  6318.   Section 2:      Deinstalling PostgreSQL
  6319.   ----------------------------------------------------------------------
  6320.  
  6321.   2.1)    Why can't I move the executable files?
  6322.  
  6323.           By default, the IRIX port uses the BSD compatible version of
  6324.           install from /usr/bin/X11. If you read the man page for this
  6325.           version of install, you will see that it is not meant for
  6326.           end-user use; it has the interesting side-effect of chowning
  6327.           files it installs to root.
  6328.  
  6329.           You should still be able to delete the files as you (the
  6330.           postgres user) will own the directory in which they are
  6331.           stored.
  6332.  
  6333.           The normal IRIX install program cannot be used easily as it
  6334.           takes its arguments in the reverse order. It is therefore
  6335.           recommended to use the GNU version of install (ginstall).
  6336.           See Question 1.4
  6337.  
  6338.   ----------------------------------------------------------------------
  6339.   Section 3:      Extending PostgreSQL
  6340.   ----------------------------------------------------------------------
  6341.   3.1)    How do I compile a C program to create a function for extending
  6342.           PostgreSQL
  6343.  
  6344.           Here is a sample command line:
  6345.  
  6346.           cc -I/usr/local/PostgreSQL/include/ -I/usr/local/PostgreSQL/src/backend
  6347.                   -shared -o funcs.so funcs.c
  6348.  
  6349.   ----------------------------------------------------------------------------
  6350.   Dr. Andrew C.R. Martin                             University College London
  6351.   EMAIL: (Work) martin@biochem.ucl.ac.uk    (Home) andrew@stagleys.demon.co.uk
  6352.   URL:   http://www.biochem.ucl.ac.uk/~martin
  6353.   Tel:   (Work) +44(0)171 419 3890                    (Home) +44(0)1372 275775
  6354.  
  6355.   41.  Copyright Notice
  6356.  
  6357.   Copyright (c) 1997 Al Dev (Alavoor Vasudevan). All rights reserved.
  6358.  
  6359.   NO LIABILITY FOR CONSEQUENTIAL DAMAGES. In no event shall the author
  6360.   of this document be liable for any damages whatsoever (including
  6361.   without limitation, special, incidental, consequential, or
  6362.   direct/indirect damages for personal injury, loss of business profits,
  6363.   business interruption, loss of business information, or any other
  6364.   pecuniary loss) arising out of the use of this document.
  6365.  
  6366.   Author offers no warranties or guarantees on fitness, usablity,
  6367.   mechantability of this document. Brands, companies and product names
  6368.   mentioned in this document are trademarks or registered trademarks of
  6369.   their respective holders.  Please refer to individual copyright
  6370.   notices of brands, companies and products mentioned in this document.
  6371.   It is your responsibility to read and understand the copyright notices
  6372.   of the organisations/companies/products/authors mentioned in this
  6373.   document before using their respective information.
  6374.  
  6375.   42.  Appendix A - Syntax of ANSI/ISO SQL 1992
  6376.  
  6377.   This file contains a depth-first tree traversal of the BNF
  6378.   for the  language done at about 27-AUG-1992 11:03:41.64.
  6379.   The specific version of the BNF included here is:  ANSI-only, SQL2-only.
  6380.  
  6381.   <SQL terminal character> ::=
  6382.         <SQL language character>
  6383.       | <SQL embedded language character>
  6384.  
  6385.   <SQL language character> ::=
  6386.         <simple Latin letter>
  6387.       | <digit>
  6388.       | <SQL special character>
  6389.  
  6390.   <simple Latin letter> ::=
  6391.         <simple Latin upper case letter>
  6392.       | <simple Latin lower case letter>
  6393.  
  6394.   <simple Latin upper case letter> ::=
  6395.             A | B | C | D | E | F | G | H | I | J | K | L | M | N | O
  6396.       | P | Q | R | S | T | U | V | W | X | Y | Z
  6397.  
  6398.   <simple Latin lower case letter> ::=
  6399.             a | b | c | d | e | f | g | h | i | j | k | l | m | n | o
  6400.       | p | q | r | s | t | u | v | w | x | y | z
  6401.  
  6402.   <digit> ::=
  6403.       0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  6404.  
  6405.   <SQL special character> ::=
  6406.         <space>
  6407.       | <double quote>
  6408.       | <percent>
  6409.       | <ampersand>
  6410.       | <quote>
  6411.       | <left paren>
  6412.       | <right paren>
  6413.       | <asterisk>
  6414.       | <plus sign>
  6415.       | <comma>
  6416.       | <minus sign>
  6417.       | <period>
  6418.       | <solidus>
  6419.       | <colon>
  6420.       | <semicolon>
  6421.       | <less than operator>
  6422.       | <equals operator>
  6423.       | <greater than operator>
  6424.       | <question mark>
  6425.       | <underscore>
  6426.       | <vertical bar>
  6427.  
  6428.   <space> ::= !! <EMPHASIS>(space character in character set in use)
  6429.  
  6430.   <double quote> ::= "
  6431.  
  6432.   <percent> ::= %
  6433.  
  6434.   <ampersand> ::= &
  6435.  
  6436.   <quote> ::= '
  6437.  
  6438.   <left paren> ::= (
  6439.  
  6440.   <right paren> ::= )
  6441.  
  6442.   <asterisk> ::= *
  6443.  
  6444.   <plus sign> ::= +
  6445.  
  6446.   <comma> ::= ,
  6447.  
  6448.   <minus sign> ::= -
  6449.  
  6450.   <period> ::= .
  6451.  
  6452.   <solidus> ::= /
  6453.  
  6454.   <colon> ::= :
  6455.  
  6456.   <semicolon> ::= ;
  6457.  
  6458.   <less than operator> ::= <
  6459.  
  6460.   <equals operator> ::= =
  6461.  
  6462.   <greater than operator> ::= >
  6463.  
  6464.   <question mark> ::= ?
  6465.  
  6466.   <underscore> ::= _
  6467.  
  6468.   <vertical bar> ::= |
  6469.  
  6470.   <SQL embedded language character> ::=
  6471.         <left bracket>
  6472.       | <right bracket>
  6473.  
  6474.   <left bracket> ::= [
  6475.  
  6476.   <right bracket> ::= ]
  6477.  
  6478.   <token> ::=
  6479.         <nondelimiter token>
  6480.       | <delimiter token>
  6481.  
  6482.   <nondelimiter token> ::=
  6483.         <regular identifier>
  6484.       | <key word>
  6485.       | <unsigned numeric literal>
  6486.       | <national character string literal>
  6487.       | <bit string literal>
  6488.       | <hex string literal>
  6489.  
  6490.   <regular identifier> ::= <identifier body>
  6491.  
  6492.   <identifier body> ::=
  6493.       <identifier start> [ ( <underscore> | <identifier part> )... ]
  6494.  
  6495.   <identifier start> ::= <EMPHASIS>(!! See the Syntax Rules)
  6496.  
  6497.   <identifier part> ::=
  6498.         <identifier start>
  6499.       | <digit>
  6500.  
  6501.   <key word> ::=
  6502.         <reserved word>
  6503.       | <non-reserved word>
  6504.  
  6505.   <reserved word> ::=
  6506.         ABSOLUTE | ACTION | ADD | ALL
  6507.       | ALLOCATE | ALTER | AND
  6508.       | ANY | ARE
  6509.       | AS | ASC
  6510.       | ASSERTION | AT
  6511.       | AUTHORIZATION | AVG
  6512.       | BEGIN | BETWEEN | BIT | BIT_LENGTH
  6513.       | BOTH | BY
  6514.       | CASCADE | CASCADED | CASE | CAST
  6515.       | CATALOG
  6516.       | CHAR | CHARACTER | CHAR_LENGTH
  6517.       | CHARACTER_LENGTH | CHECK | CLOSE | COALESCE
  6518.       | COLLATE | COLLATION
  6519.       | COLUMN | COMMIT
  6520.       | CONNECT
  6521.       | CONNECTION | CONSTRAINT
  6522.       | CONSTRAINTS | CONTINUE
  6523.       | CONVERT | CORRESPONDING | COUNT | CREATE | CROSS
  6524.       | CURRENT
  6525.       | CURRENT_DATE | CURRENT_TIME
  6526.       | CURRENT_TIMESTAMP | CURRENT_USER | CURSOR
  6527.       | DATE | DAY | DEALLOCATE | DEC
  6528.       | DECIMAL | DECLARE | DEFAULT | DEFERRABLE
  6529.       | DEFERRED | DELETE | DESC | DESCRIBE | DESCRIPTOR
  6530.       | DIAGNOSTICS
  6531.       | DISCONNECT | DISTINCT | DOMAIN | DOUBLE | DROP
  6532.       | ELSE | END | END-EXEC | ESCAPE
  6533.       | EXCEPT | EXCEPTION
  6534.       | EXEC | EXECUTE | EXISTS
  6535.       | EXTERNAL | EXTRACT
  6536.       | FALSE | FETCH | FIRST | FLOAT | FOR
  6537.       | FOREIGN | FOUND | FROM | FULL
  6538.       | GET | GLOBAL | GO | GOTO
  6539.       | GRANT | GROUP
  6540.       | HAVING | HOUR
  6541.       | IDENTITY | IMMEDIATE | IN | INDICATOR
  6542.       | INITIALLY | INNER | INPUT
  6543.       | INSENSITIVE | INSERT | INT | INTEGER | INTERSECT
  6544.       | INTERVAL | INTO | IS
  6545.       | ISOLATION
  6546.       | JOIN
  6547.       | KEY
  6548.       | LANGUAGE | LAST | LEADING | LEFT
  6549.       | LEVEL | LIKE | LOCAL | LOWER
  6550.       | MATCH | MAX | MIN | MINUTE | MODULE
  6551.       | MONTH
  6552.       | NAMES | NATIONAL | NATURAL | NCHAR | NEXT | NO
  6553.       | NOT | NULL
  6554.       | NULLIF | NUMERIC
  6555.       | OCTET_LENGTH | OF
  6556.       | ON | ONLY | OPEN | OPTION | OR
  6557.       | ORDER | OUTER
  6558.       | OUTPUT | OVERLAPS
  6559.       | PAD | PARTIAL | POSITION | PRECISION | PREPARE
  6560.       | PRESERVE | PRIMARY
  6561.       | PRIOR | PRIVILEGES | PROCEDURE | PUBLIC
  6562.       | READ | REAL | REFERENCES | RELATIVE | RESTRICT
  6563.       | REVOKE | RIGHT
  6564.       | ROLLBACK | ROWS
  6565.       | SCHEMA | SCROLL | SECOND | SECTION
  6566.       | SELECT
  6567.       | SESSION | SESSION_USER | SET
  6568.       | SIZE | SMALLINT | SOME | SPACE | SQL | SQLCODE
  6569.       | SQLERROR | SQLSTATE
  6570.       | SUBSTRING | SUM | SYSTEM_USER
  6571.       | TABLE | TEMPORARY
  6572.       | THEN | TIME | TIMESTAMP
  6573.       | TIMEZONE_HOUR | TIMEZONE_MINUTE
  6574.       | TO | TRAILING | TRANSACTION
  6575.       | TRANSLATE | TRANSLATION | TRIM | TRUE
  6576.       | UNION | UNIQUE | UNKNOWN | UPDATE | UPPER | USAGE
  6577.       | USER | USING
  6578.       | VALUE | VALUES | VARCHAR | VARYING | VIEW
  6579.       | WHEN | WHENEVER | WHERE | WITH | WORK | WRITE
  6580.       | YEAR
  6581.       | ZONE
  6582.  
  6583.   <non-reserved word> ::=
  6584.  
  6585.         ADA
  6586.       | C | CATALOG_NAME
  6587.       | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME
  6588.       | CHARACTER_SET_SCHEMA | CLASS_ORIGIN | COBOL | COLLATION_CATALOG
  6589.       | COLLATION_NAME | COLLATION_SCHEMA | COLUMN_NAME | COMMAND_FUNCTION
  6590.       | COMMITTED
  6591.       | CONDITION_NUMBER | CONNECTION_NAME | CONSTRAINT_CATALOG | CONSTRAINT_NAME
  6592.       | CONSTRAINT_SCHEMA | CURSOR_NAME
  6593.       | DATA | DATETIME_INTERVAL_CODE
  6594.       | DATETIME_INTERVAL_PRECISION | DYNAMIC_FUNCTION
  6595.       | FORTRAN
  6596.       | LENGTH
  6597.       | MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | MORE | MUMPS
  6598.       | NAME | NULLABLE | NUMBER
  6599.       | PASCAL | PLI
  6600.       | REPEATABLE | RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE
  6601.       | ROW_COUNT
  6602.       | SCALE | SCHEMA_NAME | SERIALIZABLE | SERVER_NAME | SUBCLASS_ORIGIN
  6603.       | TABLE_NAME | TYPE
  6604.       | UNCOMMITTED | UNNAMED
  6605.  
  6606.   <unsigned numeric literal> ::=
  6607.         <exact numeric literal>
  6608.       | <approximate numeric literal>
  6609.  
  6610.   <exact numeric literal> ::=
  6611.         <unsigned integer> [ <period> [ <unsigned integer> ] ]
  6612.       | <period> <unsigned integer>
  6613.  
  6614.   <unsigned integer> ::= <digit>...
  6615.  
  6616.   <approximate numeric literal> ::= <mantissa> E <exponent>
  6617.  
  6618.   <mantissa> ::= <exact numeric literal>
  6619.  
  6620.   <exponent> ::= <signed integer>
  6621.  
  6622.   <signed integer> ::= [ <sign> ] <unsigned integer>
  6623.  
  6624.   <sign> ::= <plus sign> | <minus sign>
  6625.  
  6626.   <national character string literal> ::=
  6627.       N <quote> [ <character representation>... ] <quote>
  6628.         [ ( <separator>... <quote> [ <character representation>... ] <quote> )... ]
  6629.  
  6630.   <character representation> ::=
  6631.         <nonquote character>
  6632.       | <quote symbol>
  6633.  
  6634.   <nonquote character> ::= !! <EMPHASIS>(See the Syntax Rules.)
  6635.  
  6636.   <quote symbol> ::= <quote><quote>
  6637.  
  6638.   <separator> ::= ( <comment> | <space> | <newline> )...
  6639.  
  6640.   <comment> ::=
  6641.       <comment introducer> [ <comment character>... ] <newline>
  6642.  
  6643.   <comment introducer> ::= <minus sign><minus sign>[<minus sign>...]
  6644.  
  6645.   <comment character> ::=
  6646.         <nonquote character>
  6647.       | <quote>
  6648.  
  6649.   <newline> ::= !! <EMPHASIS>(implementation-defined end-of-line indicator)
  6650.  
  6651.   <bit string literal> ::=
  6652.       B <quote> [ <bit>... ] <quote>
  6653.         [ ( <separator>... <quote> [ <bit>... ] <quote> )... ]
  6654.  
  6655.   <bit> ::= 0 | 1
  6656.  
  6657.   <hex string literal> ::=
  6658.       X <quote> [ <hexit>... ] <quote>
  6659.         [ ( <separator>... <quote> [ <hexit>... ] <quote> )... ]
  6660.  
  6661.   <hexit> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f
  6662.  
  6663.   <delimiter token> ::=
  6664.         <character string literal>
  6665.       | <date string>
  6666.       | <time string>
  6667.       | <timestamp string>
  6668.       | <interval string>
  6669.       | <delimited identifier>
  6670.       | <SQL special character>
  6671.       | <not equals operator>
  6672.       | <greater than or equals operator>
  6673.       | <less than or equals operator>
  6674.       | <concatenation operator>
  6675.       | <double period>
  6676.       | <left bracket>
  6677.       | <right bracket>
  6678.  
  6679.   <character string literal> ::=
  6680.       [ <introducer><character set specification> ]
  6681.       <quote> [ <character representation>... ] <quote>
  6682.         [ ( <separator>... <quote> [ <character representation>... ] <quote> )... ]
  6683.  
  6684.   <introducer> ::= <underscore>
  6685.  
  6686.   <character set specification> ::=
  6687.         <standard character repertoire name>
  6688.       | <implementation-defined character repertoire name>
  6689.       | <user-defined character repertoire name>
  6690.       | <standard universal character form-of-use name>
  6691.       | <implementation-defined universal character form-of-use name>
  6692.  
  6693.   <standard character repertoire name> ::= <character set name>
  6694.  
  6695.   <character set name> ::= [ <schema name> <period> ]
  6696.         <SQL language identifier>
  6697.  
  6698.   <schema name> ::=
  6699.       [ <catalog name> <period> ] <unqualified schema name>
  6700.  
  6701.   <catalog name> ::= <identifier>
  6702.  
  6703.   <identifier> ::=
  6704.       [ <introducer><character set specification> ] <actual identifier>
  6705.  
  6706.   <actual identifier> ::=
  6707.         <regular identifier>
  6708.       | <delimited identifier>
  6709.  
  6710.   <delimited identifier> ::=
  6711.       <double quote> <delimited identifier body> <double quote>
  6712.  
  6713.   <delimited identifier body> ::= <delimited identifier part>...
  6714.  
  6715.   <delimited identifier part> ::=
  6716.         <nondoublequote character>
  6717.       | <doublequote symbol>
  6718.  
  6719.   <nondoublequote character> ::= <EMPHASIS>(!! See the Syntax Rules)
  6720.  
  6721.   <doublequote symbol> ::= <double quote><double quote>
  6722.  
  6723.   <unqualified schema name> ::= <identifier>
  6724.  
  6725.   <SQL language identifier> ::=
  6726.       <SQL language identifier start>
  6727.          [ ( <underscore> | <SQL language identifier part> )... ]
  6728.  
  6729.   <SQL language identifier start> ::= <simple Latin letter>
  6730.  
  6731.   <SQL language identifier part> ::=
  6732.         <simple Latin letter>
  6733.       | <digit>
  6734.  
  6735.   <implementation-defined character repertoire name> ::=
  6736.       <character set name>
  6737.  
  6738.   <user-defined character repertoire name> ::= <character set name>
  6739.  
  6740.   <standard universal character form-of-use name> ::=
  6741.       <character set name>
  6742.  
  6743.   <implementation-defined universal character form-of-use name> ::=
  6744.       <character set name>
  6745.  
  6746.   <date string> ::=
  6747.       <quote> <date value> <quote>
  6748.  
  6749.   <date value> ::=
  6750.       <years value> <minus sign> <months value>
  6751.           <minus sign> <days value>
  6752.  
  6753.   <years value> ::= <datetime value>
  6754.  
  6755.   <datetime value> ::= <unsigned integer>
  6756.  
  6757.   <months value> ::= <datetime value>
  6758.  
  6759.   <days value> ::= <datetime value>
  6760.  
  6761.   <time string> ::=
  6762.       <quote> <time value> [ <time zone interval> ] <quote>
  6763.  
  6764.   <time value> ::=
  6765.       <hours value> <colon> <minutes value> <colon> <seconds value>
  6766.  
  6767.   <hours value> ::= <datetime value>
  6768.  
  6769.   <minutes value> ::= <datetime value>
  6770.  
  6771.   <seconds value> ::=
  6772.         <seconds integer value> [ <period> [ <seconds fraction> ] ]
  6773.  
  6774.   <seconds integer value> ::= <unsigned integer>
  6775.  
  6776.   <seconds fraction> ::= <unsigned integer>
  6777.  
  6778.   <time zone interval> ::=
  6779.       <sign> <hours value> <colon> <minutes value>
  6780.  
  6781.   <timestamp string> ::=
  6782.       <quote> <date value> <space> <time value>
  6783.           [ <time zone interval> ] <quote>
  6784.  
  6785.   <interval string> ::=
  6786.       <quote> ( <year-month literal> | <day-time literal> ) <quote>
  6787.  
  6788.   <year-month literal> ::=
  6789.         <years value>
  6790.       | [ <years value> <minus sign> ] <months value>
  6791.  
  6792.   <day-time literal> ::=
  6793.         <day-time interval>
  6794.       | <time interval>
  6795.  
  6796.   <day-time interval> ::=
  6797.       <days value>
  6798.         [ <space> <hours value> [ <colon> <minutes value>
  6799.           [ <colon> <seconds value> ] ] ]
  6800.  
  6801.   <time interval> ::=
  6802.         <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ]
  6803.       | <minutes value> [ <colon> <seconds value> ]
  6804.       | <seconds value>
  6805.  
  6806.   <not equals operator> ::= <>
  6807.  
  6808.   <greater than or equals operator> ::= >=
  6809.  
  6810.   <less than or equals operator> ::= <=
  6811.  
  6812.   <concatenation operator> ::= ||
  6813.  
  6814.   <double period> ::= ..
  6815.  
  6816.   <module> ::=
  6817.       <module name clause>
  6818.       <language clause>
  6819.       <module authorization clause>
  6820.       [ <temporary table declaration>... ]
  6821.       <module contents>...
  6822.  
  6823.   <module name clause> ::=
  6824.       MODULE [ <module name> ]
  6825.         [ <module character set specification> ]
  6826.  
  6827.   <module name> ::= <identifier>
  6828.  
  6829.   <module character set specification> ::=
  6830.       NAMES ARE <character set specification>
  6831.  
  6832.   <language clause> ::=
  6833.       LANGUAGE <language name>
  6834.  
  6835.   <language name> ::=
  6836.       ADA | C | COBOL | FORTRAN | MUMPS | PASCAL | PLI
  6837.  
  6838.   <module authorization clause> ::=
  6839.         SCHEMA <schema name>
  6840.       | AUTHORIZATION <module authorization identifier>
  6841.       | SCHEMA <schema name>
  6842.             AUTHORIZATION <module authorization identifier>
  6843.  
  6844.   <module authorization identifier> ::=
  6845.       <authorization identifier>
  6846.  
  6847.   <authorization identifier> ::= <identifier>
  6848.  
  6849.   <temporary table declaration> ::=
  6850.       DECLARE LOCAL TEMPORARY TABLE
  6851.           <qualified local table name>
  6852.         <table element list>
  6853.         [ ON COMMIT ( PRESERVE | DELETE ) ROWS ]
  6854.  
  6855.   <qualified local table name> ::=
  6856.       MODULE <period> <local table name>
  6857.  
  6858.   <local table name> ::= <qualified identifier>
  6859.  
  6860.   <qualified identifier> ::= <identifier>
  6861.  
  6862.   <table element list> ::=
  6863.         <left paren> <table element> [ ( <comma> <table element> )... ] <right paren>
  6864.  
  6865.   <table element> ::=
  6866.         <column definition>
  6867.       | <table constraint definition>
  6868.  
  6869.   <column definition> ::=
  6870.       <column name> ( <data type> | <domain name> )
  6871.       [ <default clause> ]
  6872.       [ <column constraint definition>... ]
  6873.       [ <collate clause> ]
  6874.  
  6875.   <column name> ::= <identifier>
  6876.  
  6877.   <data type> ::=
  6878.         <character string type>
  6879.              [ CHARACTER SET <character set specification> ]
  6880.       | <national character string type>
  6881.       | <bit string type>
  6882.       | <numeric type>
  6883.       | <datetime type>
  6884.       | <interval type>
  6885.  
  6886.   <character string type> ::=
  6887.         CHARACTER [ <left paren> <length> <right paren> ]
  6888.       | CHAR [ <left paren> <length> <right paren> ]
  6889.       | CHARACTER VARYING <left paren> <length> <right paren>
  6890.       | CHAR VARYING <left paren> <length> <right paren>
  6891.       | VARCHAR <left paren> <length> <right paren>
  6892.  
  6893.   <length> ::= <unsigned integer>
  6894.  
  6895.   <national character string type> ::=
  6896.         NATIONAL CHARACTER [ <left paren> <length> <right paren> ]
  6897.       | NATIONAL CHAR [ <left paren> <length> <right paren> ]
  6898.       | NCHAR [ <left paren> <length> <right paren> ]
  6899.       | NATIONAL CHARACTER VARYING <left paren> <length> <right paren>
  6900.       | NATIONAL CHAR VARYING <left paren> <length> <right paren>
  6901.       | NCHAR VARYING <left paren> <length> <right paren>
  6902.  
  6903.   <bit string type> ::=
  6904.         BIT [ <left paren> <length> <right paren> ]
  6905.       | BIT VARYING <left paren> <length> <right paren>
  6906.  
  6907.   <numeric type> ::=
  6908.         <exact numeric type>
  6909.       | <approximate numeric type>
  6910.  
  6911.   <exact numeric type> ::=
  6912.         NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  6913.       | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  6914.       | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  6915.       | INTEGER
  6916.       | INT
  6917.       | SMALLINT
  6918.  
  6919.   <precision> ::= <unsigned integer>
  6920.  
  6921.   <scale> ::= <unsigned integer>
  6922.  
  6923.   <approximate numeric type> ::=
  6924.         FLOAT [ <left paren> <precision> <right paren> ]
  6925.       | REAL
  6926.       | DOUBLE PRECISION
  6927.  
  6928.   <datetime type> ::=
  6929.         DATE
  6930.       | TIME [ <left paren> <time precision> <right paren> ]
  6931.             [ WITH TIME ZONE ]
  6932.       | TIMESTAMP [ <left paren> <timestamp precision> <right paren> ]
  6933.             [ WITH TIME ZONE ]
  6934.  
  6935.   <time precision> ::= <time fractional seconds precision>
  6936.  
  6937.   <time fractional seconds precision> ::= <unsigned integer>
  6938.  
  6939.   <timestamp precision> ::= <time fractional seconds precision>
  6940.  
  6941.   <interval type> ::= INTERVAL <interval qualifier>
  6942.  
  6943.   <interval qualifier> ::=
  6944.         <start field> TO <end field>
  6945.       | <single datetime field>
  6946.  
  6947.   <start field> ::=
  6948.       <non-second datetime field>
  6949.           [ <left paren> <interval leading field precision> <right paren> ]
  6950.  
  6951.   <non-second datetime field> ::= YEAR | MONTH | DAY | HOUR
  6952.       | MINUTE
  6953.  
  6954.   <interval leading field precision> ::= <unsigned integer>
  6955.  
  6956.   <end field> ::=
  6957.         <non-second datetime field>
  6958.       | SECOND [ <left paren> <interval fractional seconds precision> <right paren> ]
  6959.  
  6960.   <interval fractional seconds precision> ::= <unsigned integer>
  6961.  
  6962.   <single datetime field> ::=
  6963.         <non-second datetime field>
  6964.             [ <left paren> <interval leading field precision> <right paren> ]
  6965.       | SECOND [ <left paren> <interval leading field precision>
  6966.             [ <comma> <interval fractional seconds precision> ] <right paren> ]
  6967.  
  6968.   <domain name> ::= <qualified name>
  6969.  
  6970.   <qualified name> ::=
  6971.       [ <schema name> <period> ] <qualified identifier>
  6972.  
  6973.   <default clause> ::=
  6974.         DEFAULT <default option>
  6975.  
  6976.   <default option> ::=
  6977.         <literal>
  6978.       | <datetime value function>
  6979.       | USER
  6980.       | CURRENT_USER
  6981.       | SESSION_USER
  6982.       | SYSTEM_USER
  6983.       | NULL
  6984.  
  6985.   <literal> ::=
  6986.         <signed numeric literal>
  6987.       | <general literal>
  6988.  
  6989.   <signed numeric literal> ::=
  6990.       [ <sign> ] <unsigned numeric literal>
  6991.  
  6992.   <general literal> ::=
  6993.         <character string literal>
  6994.       | <national character string literal>
  6995.       | <bit string literal>
  6996.       | <hex string literal>
  6997.       | <datetime literal>
  6998.       | <interval literal>
  6999.  
  7000.   <datetime literal> ::=
  7001.         <date literal>
  7002.       | <time literal>
  7003.       | <timestamp literal>
  7004.  
  7005.   <date literal> ::=
  7006.       DATE <date string>
  7007.  
  7008.   <time literal> ::=
  7009.       TIME <time string>
  7010.  
  7011.   <timestamp literal> ::=
  7012.       TIMESTAMP <timestamp string>
  7013.  
  7014.   <interval literal> ::=
  7015.       INTERVAL [ <sign> ] <interval string> <interval qualifier>
  7016.  
  7017.   <datetime value function> ::=
  7018.         <current date value function>
  7019.       | <current time value function>
  7020.       | <current timestamp value function>
  7021.  
  7022.   <current date value function> ::= CURRENT_DATE
  7023.  
  7024.   <current time value function> ::=
  7025.         CURRENT_TIME [ <left paren> <time precision> <right paren> ]
  7026.  
  7027.   <current timestamp value function> ::=
  7028.         CURRENT_TIMESTAMP [ <left paren> <timestamp precision> <right paren> ]
  7029.  
  7030.   <column constraint definition> ::=
  7031.       [ <constraint name definition> ]
  7032.       <column constraint>
  7033.         [ <constraint attributes> ]
  7034.  
  7035.   <constraint name definition> ::= CONSTRAINT <constraint name>
  7036.   <constraint name> ::= <qualified name>
  7037.  
  7038.   <column constraint> ::=
  7039.         NOT NULL
  7040.       | <unique specification>
  7041.       | <references specification>
  7042.       | <check constraint definition>
  7043.  
  7044.   <unique specification> ::=
  7045.       UNIQUE | PRIMARY KEY
  7046.  
  7047.   <references specification> ::=
  7048.       REFERENCES <referenced table and columns>
  7049.         [ MATCH <match type> ]
  7050.         [ <referential triggered action> ]
  7051.  
  7052.   <referenced table and columns> ::=
  7053.        <table name> [ <left paren> <reference column list> <right paren> ]
  7054.  
  7055.   <table name> ::=
  7056.         <qualified name>
  7057.       | <qualified local table name>
  7058.  
  7059.   <reference column list> ::= <column name list>
  7060.  
  7061.   <column name list> ::=
  7062.       <column name> [ ( <comma> <column name> )... ]
  7063.  
  7064.   <match type> ::=
  7065.         FULL
  7066.       | PARTIAL
  7067.  
  7068.   <referential triggered action> ::=
  7069.         <update rule> [ <delete rule> ]
  7070.       | <delete rule> [ <update rule> ]
  7071.  
  7072.   <update rule> ::= ON UPDATE <referential action>
  7073.  
  7074.   <referential action> ::=
  7075.         CASCADE
  7076.       | SET NULL
  7077.       | SET DEFAULT
  7078.       | NO ACTION
  7079.  
  7080.   <delete rule> ::= ON DELETE <referential action>
  7081.  
  7082.   <check constraint definition> ::=
  7083.       CHECK
  7084.           <left paren> <search condition> <right paren>
  7085.  
  7086.   <search condition> ::=
  7087.         <boolean term>
  7088.       | <search condition> OR <boolean term>
  7089.  
  7090.   <boolean term> ::=
  7091.         <boolean factor>
  7092.       | <boolean term> AND <boolean factor>
  7093.  
  7094.   <boolean factor> ::=
  7095.       [ NOT ] <boolean test>
  7096.  
  7097.   <boolean test> ::=
  7098.       <boolean primary> [ IS [ NOT ]
  7099.             <truth value> ]
  7100.  
  7101.   <boolean primary> ::=
  7102.         <predicate>
  7103.       | <left paren> <search condition> <right paren>
  7104.  
  7105.   <predicate> ::=
  7106.         <comparison predicate>
  7107.       | <between predicate>
  7108.       | <in predicate>
  7109.       | <like predicate>
  7110.       | <null predicate>
  7111.       | <quantified comparison predicate>
  7112.       | <exists predicate>
  7113.       | <unique predicate>
  7114.       | <match predicate>
  7115.       | <overlaps predicate>
  7116.  
  7117.   <comparison predicate> ::=
  7118.       <row value constructor> <comp op>
  7119.           <row value constructor>
  7120.  
  7121.   <row value constructor> ::=
  7122.          <row value constructor element>
  7123.       | <left paren> <row value constructor list> <right paren>
  7124.       | <row subquery>
  7125.  
  7126.   <row value constructor element> ::=
  7127.         <value expression>
  7128.       | <null specification>
  7129.       | <default specification>
  7130.  
  7131.   <value expression> ::=
  7132.         <numeric value expression>
  7133.       | <string value expression>
  7134.       | <datetime value expression>
  7135.       | <interval value expression>
  7136.  
  7137.   <numeric value expression> ::=
  7138.         <term>
  7139.       | <numeric value expression> <plus sign> <term>
  7140.       | <numeric value expression> <minus sign> <term>
  7141.  
  7142.   <term> ::=
  7143.         <factor>
  7144.       | <term> <asterisk> <factor>
  7145.       | <term> <solidus> <factor>
  7146.  
  7147.   <factor> ::=
  7148.       [ <sign> ] <numeric primary>
  7149.  
  7150.   <numeric primary> ::=
  7151.         <value expression primary>
  7152.       | <numeric value function>
  7153.  
  7154.   <value expression primary> ::=
  7155.         <unsigned value specification>
  7156.       | <column reference>
  7157.       | <set function specification>
  7158.       | <scalar subquery>
  7159.       | <case expression>
  7160.       | <left paren> <value expression> <right paren>
  7161.       | <cast specification>
  7162.  
  7163.   <unsigned value specification> ::=
  7164.         <unsigned literal>
  7165.       | <general value specification>
  7166.  
  7167.   <unsigned literal> ::=
  7168.         <unsigned numeric literal>
  7169.       | <general literal>
  7170.  
  7171.   <general value specification> ::=
  7172.         <parameter specification>
  7173.       | <dynamic parameter specification>
  7174.       | <variable specification>
  7175.       | USER
  7176.       | CURRENT_USER
  7177.       | SESSION_USER
  7178.       | SYSTEM_USER
  7179.       | VALUE
  7180.  
  7181.   <parameter specification> ::=
  7182.       <parameter name> [ <indicator parameter> ]
  7183.  
  7184.   <parameter name> ::= <colon> <identifier>
  7185.  
  7186.   <indicator parameter> ::=
  7187.       [ INDICATOR ] <parameter name>
  7188.  
  7189.   <dynamic parameter specification> ::= <question mark>
  7190.  
  7191.   <variable specification> ::=
  7192.       <embedded variable name> [ <indicator variable> ]
  7193.  
  7194.   <embedded variable name> ::=
  7195.       <colon><host identifier>
  7196.  
  7197.   <host identifier> ::=
  7198.         <Ada host identifier>
  7199.       | <C host identifier>
  7200.       | <COBOL host identifier>
  7201.       | <Fortran host identifier>
  7202.       | <MUMPS host identifier>
  7203.       | <Pascal host identifier>
  7204.       | <PL/I host identifier>
  7205.  
  7206.   <Ada host identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)
  7207.  
  7208.   <C host identifier> ::=
  7209.       !! <EMPHASIS>(See the Syntax Rules.)
  7210.  
  7211.   <COBOL host identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)
  7212.  
  7213.   <Fortran host identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)
  7214.  
  7215.   <MUMPS host identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)
  7216.  
  7217.   <Pascal host identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)
  7218.  
  7219.   <PL/I host identifier> ::= !! <EMPHASIS>(See the Syntax Rules.)
  7220.  
  7221.   <indicator variable> ::=
  7222.       [ INDICATOR ] <embedded variable name>
  7223.  
  7224.   <column reference> ::= [ <qualifier> <period> ] <column name>
  7225.  
  7226.   <qualifier> ::=
  7227.         <table name>
  7228.       | <correlation name>
  7229.  
  7230.   <correlation name> ::= <identifier>
  7231.  
  7232.   <set function specification> ::=
  7233.         COUNT <left paren> <asterisk> <right paren>
  7234.       | <general set function>
  7235.  
  7236.   <general set function> ::=
  7237.         <set function type>
  7238.             <left paren> [ <set quantifier> ] <value expression> <right paren>
  7239.  
  7240.   <set function type> ::=
  7241.       AVG | MAX | MIN | SUM | COUNT
  7242.  
  7243.   <set quantifier> ::= DISTINCT | ALL
  7244.  
  7245.   <scalar subquery> ::= <subquery>
  7246.  
  7247.   <subquery> ::= <left paren> <query expression> <right paren>
  7248.  
  7249.   <query expression> ::=
  7250.         <non-join query expression>
  7251.       | <joined table>
  7252.  
  7253.   <non-join query expression> ::=
  7254.         <non-join query term>
  7255.       | <query expression> UNION  [ ALL ]
  7256.             [ <corresponding spec> ] <query term>
  7257.       | <query expression> EXCEPT [ ALL ]
  7258.             [ <corresponding spec> ] <query term>
  7259.  
  7260.   <non-join query term> ::=
  7261.         <non-join query primary>
  7262.       | <query term> INTERSECT [ ALL ]
  7263.             [ <corresponding spec> ] <query primary>
  7264.  
  7265.   <non-join query primary> ::=
  7266.         <simple table>
  7267.       | <left paren> <non-join query expression> <right paren>
  7268.  
  7269.   <simple table> ::=
  7270.         <query specification>
  7271.       | <table value constructor>
  7272.       | <explicit table>
  7273.  
  7274.   <query specification> ::=
  7275.       SELECT [ <set quantifier> ] <select list> <table expression>
  7276.  
  7277.   <select list> ::=
  7278.         <asterisk>
  7279.       | <select sublist> [ ( <comma> <select sublist> )... ]
  7280.  
  7281.   <select sublist> ::=
  7282.         <derived column>
  7283.       | <qualifier> <period> <asterisk>
  7284.  
  7285.   <derived column> ::= <value expression> [ <as clause> ]
  7286.  
  7287.   <as clause> ::= [ AS ] <column name>
  7288.  
  7289.   <table expression> ::=
  7290.       <from clause>
  7291.       [ <where clause> ]
  7292.       [ <group by clause> ]
  7293.       [ <having clause> ]
  7294.  
  7295.   <from clause> ::= FROM <table reference>
  7296.       [ ( <comma> <table reference> )... ]
  7297.  
  7298.   <table reference> ::=
  7299.         <table name> [ [ AS ] <correlation name>
  7300.             [ <left paren> <derived column list> <right paren> ] ]
  7301.       | <derived table> [ AS ] <correlation name>
  7302.             [ <left paren> <derived column list> <right paren> ]
  7303.       | <joined table>
  7304.  
  7305.   <derived column list> ::= <column name list>
  7306.  
  7307.   <derived table> ::= <table subquery>
  7308.  
  7309.   <table subquery> ::= <subquery>
  7310.  
  7311.   <joined table> ::=
  7312.         <cross join>
  7313.       | <qualified join>
  7314.       | <left paren> <joined table> <right paren>
  7315.  
  7316.   <cross join> ::=
  7317.       <table reference> CROSS JOIN <table reference>
  7318.  
  7319.   <qualified join> ::=
  7320.       <table reference> [ NATURAL ] [ <join type> ] JOIN
  7321.         <table reference> [ <join specification> ]
  7322.  
  7323.   <join type> ::=
  7324.         INNER
  7325.       | <outer join type> [ OUTER ]
  7326.       | UNION
  7327.  
  7328.   <outer join type> ::=
  7329.         LEFT
  7330.       | RIGHT
  7331.       | FULL
  7332.  
  7333.   <join specification> ::=
  7334.         <join condition>
  7335.       | <named columns join>
  7336.  
  7337.   <join condition> ::= ON <search condition>
  7338.  
  7339.   <named columns join> ::=
  7340.       USING <left paren> <join column list> <right paren>
  7341.  
  7342.   <join column list> ::= <column name list>
  7343.  
  7344.   <where clause> ::= WHERE <search condition>
  7345.  
  7346.   <group by clause> ::=
  7347.       GROUP BY <grouping column reference list>
  7348.  
  7349.   <grouping column reference list> ::=
  7350.       <grouping column reference>
  7351.           [ ( <comma> <grouping column reference> )... ]
  7352.  
  7353.   <grouping column reference> ::=
  7354.       <column reference> [ <collate clause> ]
  7355.  
  7356.   <collate clause> ::= COLLATE <collation name>
  7357.  
  7358.   <collation name> ::= <qualified name>
  7359.  
  7360.   <having clause> ::= HAVING <search condition>
  7361.  
  7362.   <table value constructor> ::=
  7363.       VALUES <table value constructor list>
  7364.  
  7365.   <table value constructor list> ::=
  7366.       <row value constructor> [ ( <comma> <row value constructor> )... ]
  7367.  
  7368.   <explicit table> ::= TABLE <table name>
  7369.  
  7370.   <query term> ::=
  7371.         <non-join query term>
  7372.       | <joined table>
  7373.  
  7374.   <corresponding spec> ::=
  7375.       CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ]
  7376.  
  7377.   <corresponding column list> ::= <column name list>
  7378.  
  7379.   <query primary> ::=
  7380.         <non-join query primary>
  7381.       | <joined table>
  7382.  
  7383.   <case expression> ::=
  7384.         <case abbreviation>
  7385.       | <case specification>
  7386.  
  7387.   <case abbreviation> ::=
  7388.         NULLIF <left paren> <value expression> <comma>
  7389.               <value expression> <right paren>
  7390.       | COALESCE <left paren> <value expression>
  7391.               ( <comma> <value expression> )... <right paren>
  7392.  
  7393.   <case specification> ::=
  7394.         <simple case>
  7395.       | <searched case>
  7396.  
  7397.   <simple case> ::=
  7398.       CASE <case operand>
  7399.         <simple when clause>...
  7400.         [ <else clause> ]
  7401.       END
  7402.  
  7403.   <case operand> ::= <value expression>
  7404.  
  7405.   <simple when clause> ::= WHEN <when operand> THEN <result>
  7406.  
  7407.   <when operand> ::= <value expression>
  7408.  
  7409.   <result> ::= <result expression> | NULL
  7410.  
  7411.   <result expression> ::= <value expression>
  7412.  
  7413.   <else clause> ::= ELSE <result>
  7414.  
  7415.   <searched case> ::=
  7416.       CASE
  7417.         <searched when clause>...
  7418.         [ <else clause> ]
  7419.       END
  7420.  
  7421.   <searched when clause> ::= WHEN <search condition> THEN <result>
  7422.  
  7423.   <cast specification> ::=
  7424.       CAST <left paren> <cast operand> AS
  7425.           <cast target> <right paren>
  7426.  
  7427.   <cast operand> ::=
  7428.         <value expression>
  7429.       | NULL
  7430.  
  7431.   <cast target> ::=
  7432.         <domain name>
  7433.       | <data type>
  7434.  
  7435.   <numeric value function> ::=
  7436.         <position expression>
  7437.       | <extract expression>
  7438.       | <length expression>
  7439.  
  7440.   <position expression> ::=
  7441.       POSITION <left paren> <character value expression>
  7442.           IN <character value expression> <right paren>
  7443.  
  7444.   <character value expression> ::=
  7445.         <concatenation>
  7446.       | <character factor>
  7447.  
  7448.   <concatenation> ::=
  7449.       <character value expression> <concatenation operator>
  7450.           <character factor>
  7451.  
  7452.   <character factor> ::=
  7453.       <character primary> [ <collate clause> ]
  7454.  
  7455.   <character primary> ::=
  7456.         <value expression primary>
  7457.       | <string value function>
  7458.  
  7459.   <string value function> ::=
  7460.         <character value function>
  7461.       | <bit value function>
  7462.  
  7463.   <character value function> ::=
  7464.         <character substring function>
  7465.       | <fold>
  7466.       | <form-of-use conversion>
  7467.       | <character translation>
  7468.       | <trim function>
  7469.  
  7470.   <character substring function> ::=
  7471.       SUBSTRING <left paren> <character value expression> FROM <start position>
  7472.                   [ FOR <string length> ] <right paren>
  7473.  
  7474.   <start position> ::= <numeric value expression>
  7475.  
  7476.   <string length> ::= <numeric value expression>
  7477.  
  7478.   <fold> ::= ( UPPER | LOWER )
  7479.        <left paren> <character value expression> <right paren>
  7480.  
  7481.   <form-of-use conversion> ::=
  7482.       CONVERT <left paren> <character value expression>
  7483.           USING <form-of-use conversion name> <right paren>
  7484.  
  7485.   <form-of-use conversion name> ::= <qualified name>
  7486.  
  7487.   <character translation> ::=
  7488.       TRANSLATE <left paren> <character value expression>
  7489.           USING <translation name> <right paren>
  7490.  
  7491.   <translation name> ::= <qualified name>
  7492.  
  7493.   <trim function> ::=
  7494.       TRIM <left paren> <trim operands> <right paren>
  7495.  
  7496.   <trim operands> ::=
  7497.       [ [ <trim specification> ] [ <trim character> ] FROM ] <trim source>
  7498.   <trim specification> ::=
  7499.         LEADING
  7500.       | TRAILING
  7501.       | BOTH
  7502.  
  7503.   <trim character> ::= <character value expression>
  7504.  
  7505.   <trim source> ::= <character value expression>
  7506.  
  7507.   <bit value function> ::=
  7508.       <bit substring function>
  7509.  
  7510.   <bit substring function> ::=
  7511.       SUBSTRING <left paren> <bit value expression> FROM <start position>
  7512.           [ FOR <string length> ] <right paren>
  7513.  
  7514.   <bit value expression> ::=
  7515.         <bit concatenation>
  7516.       | <bit factor>
  7517.  
  7518.   <bit concatenation> ::=
  7519.       <bit value expression> <concatenation operator> <bit factor>
  7520.  
  7521.   <bit factor> ::= <bit primary>
  7522.  
  7523.   <bit primary> ::=
  7524.         <value expression primary>
  7525.       | <string value function>
  7526.  
  7527.   <extract expression> ::=
  7528.       EXTRACT <left paren> <extract field>
  7529.           FROM <extract source> <right paren>
  7530.  
  7531.   <extract field> ::=
  7532.         <datetime field>
  7533.       | <time zone field>
  7534.  
  7535.   <datetime field> ::=
  7536.         <non-second datetime field>
  7537.       | SECOND
  7538.  
  7539.   <time zone field> ::=
  7540.         TIMEZONE_HOUR
  7541.       | TIMEZONE_MINUTE
  7542.  
  7543.   <extract source> ::=
  7544.         <datetime value expression>
  7545.       | <interval value expression>
  7546.  
  7547.   <datetime value expression> ::=
  7548.         <datetime term>
  7549.       | <interval value expression> <plus sign> <datetime term>
  7550.       | <datetime value expression> <plus sign> <interval term>
  7551.       | <datetime value expression> <minus sign> <interval term>
  7552.  
  7553.   <interval term> ::=
  7554.         <interval factor>
  7555.       | <interval term 2> <asterisk> <factor>
  7556.       | <interval term 2> <solidus> <factor>
  7557.       | <term> <asterisk> <interval factor>
  7558.  
  7559.   <interval factor> ::=
  7560.       [ <sign> ] <interval primary>
  7561.  
  7562.   <interval primary> ::=
  7563.         <value expression primary> [ <interval qualifier> ]
  7564.   <interval term 2> ::= <interval term>
  7565.  
  7566.   <interval value expression> ::=
  7567.         <interval term>
  7568.       | <interval value expression 1> <plus sign> <interval term 1>
  7569.       | <interval value expression 1> <minus sign> <interval term 1>
  7570.       | <left paren> <datetime value expression> <minus sign>
  7571.             <datetime term> <right paren> <interval qualifier>
  7572.  
  7573.   <interval value expression 1> ::= <interval value expression>
  7574.  
  7575.   <interval term 1> ::= <interval term>
  7576.  
  7577.   <datetime term> ::=
  7578.         <datetime factor>
  7579.  
  7580.   <datetime factor> ::=
  7581.         <datetime primary> [ <time zone> ]
  7582.  
  7583.   <datetime primary> ::=
  7584.         <value expression primary>
  7585.       | <datetime value function>
  7586.  
  7587.   <time zone> ::=
  7588.       AT <time zone specifier>
  7589.  
  7590.   <time zone specifier> ::=
  7591.         LOCAL
  7592.       | TIME ZONE <interval value expression>
  7593.  
  7594.   <length expression> ::=
  7595.         <char length expression>
  7596.       | <octet length expression>
  7597.       | <bit length expression>
  7598.  
  7599.   <char length expression> ::=
  7600.       ( CHAR_LENGTH | CHARACTER_LENGTH )
  7601.           <left paren> <string value expression> <right paren>
  7602.  
  7603.   <string value expression> ::=
  7604.         <character value expression>
  7605.       | <bit value expression>
  7606.  
  7607.   <octet length expression> ::=
  7608.       OCTET_LENGTH <left paren> <string value expression> <right paren>
  7609.  
  7610.   <bit length expression> ::=
  7611.       BIT_LENGTH <left paren> <string value expression> <right paren>
  7612.  
  7613.   <null specification> ::=
  7614.       NULL
  7615.  
  7616.   <default specification> ::=
  7617.       DEFAULT
  7618.  
  7619.   <row value constructor list> ::=
  7620.       <row value constructor element>
  7621.           [ ( <comma> <row value constructor element> )... ]
  7622.  
  7623.   <row subquery> ::= <subquery>
  7624.  
  7625.   <comp op> ::=
  7626.         <equals operator>
  7627.       | <not equals operator>
  7628.       | <less than operator>
  7629.       | <greater than operator>
  7630.       | <less than or equals operator>
  7631.       | <greater than or equals operator>
  7632.  
  7633.   <between predicate> ::=
  7634.       <row value constructor> [ NOT ] BETWEEN
  7635.         <row value constructor> AND <row value constructor>
  7636.  
  7637.   <in predicate> ::=
  7638.       <row value constructor>
  7639.         [ NOT ] IN <in predicate value>
  7640.  
  7641.   <in predicate value> ::=
  7642.         <table subquery>
  7643.       | <left paren> <in value list> <right paren>
  7644.  
  7645.   <in value list> ::=
  7646.       <value expression> ( <comma> <value expression> )...
  7647.  
  7648.   <like predicate> ::=
  7649.       <match value> [ NOT ] LIKE <pattern>
  7650.         [ ESCAPE <escape character> ]
  7651.  
  7652.   <match value> ::= <character value expression>
  7653.  
  7654.   <pattern> ::= <character value expression>
  7655.  
  7656.   <escape character> ::= <character value expression>
  7657.  
  7658.   <null predicate> ::= <row value constructor>
  7659.       IS [ NOT ] NULL
  7660.  
  7661.   <quantified comparison predicate> ::=
  7662.       <row value constructor> <comp op> <quantifier> <table subquery>
  7663.  
  7664.   <quantifier> ::= <all> | <some>
  7665.  
  7666.   <all> ::= ALL
  7667.  
  7668.   <some> ::= SOME | ANY
  7669.  
  7670.   <exists predicate> ::= EXISTS <table subquery>
  7671.  
  7672.   <unique predicate> ::= UNIQUE <table subquery>
  7673.  
  7674.   <match predicate> ::=
  7675.       <row value constructor> MATCH [ UNIQUE ]
  7676.           [ PARTIAL | FULL ] <table subquery>
  7677.  
  7678.   <overlaps predicate> ::=
  7679.       <row value constructor 1> OVERLAPS <row value constructor 2>
  7680.  
  7681.   <row value constructor 1> ::= <row value constructor>
  7682.  
  7683.   <row value constructor 2> ::= <row value constructor>
  7684.  
  7685.   <truth value> ::=
  7686.         TRUE
  7687.       | FALSE
  7688.       | UNKNOWN
  7689.  
  7690.   <constraint attributes> ::=
  7691.         <constraint check time> [ [ NOT ] DEFERRABLE ]
  7692.       | [ NOT ] DEFERRABLE [ <constraint check time> ]
  7693.  
  7694.   <constraint check time> ::=
  7695.         INITIALLY DEFERRED
  7696.       | INITIALLY IMMEDIATE
  7697.  
  7698.   <table constraint definition> ::=
  7699.       [ <constraint name definition> ]
  7700.       <table constraint> [ <constraint attributes> ]
  7701.  
  7702.   <table constraint> ::=
  7703.         <unique constraint definition>
  7704.       | <referential constraint definition>
  7705.       | <check constraint definition>
  7706.  
  7707.   <unique constraint definition> ::=
  7708.               <unique specification> even in SQL3)
  7709.       <unique specification>
  7710.         <left paren> <unique column list> <right paren>
  7711.  
  7712.   <unique column list> ::= <column name list>
  7713.  
  7714.   <referential constraint definition> ::=
  7715.       FOREIGN KEY
  7716.           <left paren> <referencing columns> <right paren>
  7717.         <references specification>
  7718.  
  7719.   <referencing columns> ::=
  7720.       <reference column list>
  7721.  
  7722.   <module contents> ::=
  7723.         <declare cursor>
  7724.       | <dynamic declare cursor>
  7725.       | <procedure>
  7726.  
  7727.   <declare cursor> ::=
  7728.       DECLARE <cursor name> [ INSENSITIVE ] [ SCROLL ] CURSOR
  7729.         FOR <cursor specification>
  7730.  
  7731.   <cursor name> ::= <identifier>
  7732.  
  7733.   <cursor specification> ::=
  7734.       <query expression> [ <order by clause> ]
  7735.         [ <updatability clause> ]
  7736.  
  7737.   <order by clause> ::=
  7738.       ORDER BY <sort specification list>
  7739.  
  7740.   <sort specification list> ::=
  7741.       <sort specification> [ ( <comma> <sort specification> )... ]
  7742.  
  7743.   <sort specification> ::=
  7744.       <sort key> [ <collate clause> ] [ <ordering specification> ]
  7745.  
  7746.   <sort key> ::=
  7747.         <column name>
  7748.       | <unsigned integer>
  7749.  
  7750.   <ordering specification> ::= ASC | DESC
  7751.  
  7752.   <updatability clause> ::=
  7753.       FOR
  7754.           ( READ ONLY |
  7755.             UPDATE [ OF <column name list> ] )
  7756.  
  7757.   <dynamic declare cursor> ::=
  7758.       DECLARE <cursor name> [ INSENSITIVE ] [ SCROLL ] CURSOR
  7759.           FOR <statement name>
  7760.  
  7761.   <statement name> ::= <identifier>
  7762.   <procedure> ::=
  7763.       PROCEDURE <procedure name>
  7764.           <parameter declaration list> <semicolon>
  7765.         <SQL procedure statement> <semicolon>
  7766.  
  7767.   <procedure name> ::= <identifier>
  7768.  
  7769.   <parameter declaration list> ::=
  7770.         <left paren> <parameter declaration>
  7771.             [ ( <comma> <parameter declaration> )... ] <right paren>
  7772.       | <parameter declaration>...
  7773.  
  7774.   <parameter declaration> ::=
  7775.         <parameter name> <data type>
  7776.       | <status parameter>
  7777.  
  7778.   <status parameter> ::=
  7779.       SQLCODE | SQLSTATE
  7780.  
  7781.   <SQL procedure statement> ::=
  7782.         <SQL schema statement>
  7783.       | <SQL data statement>
  7784.       | <SQL transaction statement>
  7785.       | <SQL connection statement>
  7786.       | <SQL session statement>
  7787.       | <SQL dynamic statement>
  7788.       | <SQL diagnostics statement>
  7789.  
  7790.   <SQL schema statement> ::=
  7791.         <SQL schema definition statement>
  7792.       | <SQL schema manipulation statement>
  7793.  
  7794.   <SQL schema definition statement> ::=
  7795.         <schema definition>
  7796.       | <table definition>
  7797.       | <view definition>
  7798.       | <grant statement>
  7799.       | <domain definition>
  7800.       | <character set definition>
  7801.       | <collation definition>
  7802.       | <translation definition>
  7803.       | <assertion definition>
  7804.  
  7805.   <schema definition> ::=
  7806.       CREATE SCHEMA <schema name clause>
  7807.         [ <schema character set specification> ]
  7808.         [ <schema element>... ]
  7809.  
  7810.   <schema name clause> ::=
  7811.         <schema name>
  7812.       | AUTHORIZATION <schema authorization identifier>
  7813.       | <schema name> AUTHORIZATION
  7814.             <schema authorization identifier>
  7815.  
  7816.   <schema authorization identifier> ::=
  7817.       <authorization identifier>
  7818.  
  7819.   <schema character set specification> ::=
  7820.       DEFAULT CHARACTER
  7821.           SET <character set specification>
  7822.  
  7823.   <schema element> ::=
  7824.         <domain definition>
  7825.       | <table definition>
  7826.       | <view definition>
  7827.       | <grant statement>
  7828.       | <assertion definition>
  7829.       | <character set definition>
  7830.       | <collation definition>
  7831.       | <translation definition>
  7832.  
  7833.   <domain definition> ::=
  7834.       CREATE DOMAIN <domain name>
  7835.           [ AS ] <data type>
  7836.         [ <default clause> ]
  7837.         [ <domain constraint>... ]
  7838.         [ <collate clause> ]
  7839.  
  7840.   <domain constraint> ::=
  7841.       [ <constraint name definition> ]
  7842.       <check constraint definition> [ <constraint attributes> ]
  7843.  
  7844.   <table definition> ::=
  7845.       CREATE [ ( GLOBAL | LOCAL ) TEMPORARY ] TABLE
  7846.           <table name>
  7847.         <table element list>
  7848.         [ ON COMMIT ( DELETE | PRESERVE ) ROWS ]
  7849.  
  7850.   <view definition> ::=
  7851.       CREATE VIEW <table name> [ <left paren> <view column list>
  7852.                                     <right paren> ]
  7853.         AS <query expression>
  7854.         [ WITH [ <levels clause> ] CHECK OPTION ]
  7855.  
  7856.   <view column list> ::= <column name list>
  7857.  
  7858.   <levels clause> ::=
  7859.       CASCADED | LOCAL
  7860.  
  7861.   <grant statement> ::=
  7862.      GRANT <privileges> ON <object name>
  7863.        TO <grantee> [ ( <comma> <grantee> )... ]
  7864.          [ WITH GRANT OPTION ]
  7865.  
  7866.   <privileges> ::=
  7867.         ALL PRIVILEGES
  7868.       | <action list>
  7869.  
  7870.   <action list> ::= <action> [ ( <comma> <action> )... ]
  7871.  
  7872.   <action> ::=
  7873.         SELECT
  7874.       | DELETE
  7875.       | INSERT [ <left paren> <privilege column list> <right paren> ]
  7876.       | UPDATE [ <left paren> <privilege column list> <right paren> ]
  7877.       | REFERENCES [ <left paren> <privilege column list> <right paren> ]
  7878.       | USAGE
  7879.  
  7880.   <privilege column list> ::= <column name list>
  7881.  
  7882.   <object name> ::=
  7883.         [ TABLE ] <table name>
  7884.       | DOMAIN <domain name>
  7885.       | COLLATION <collation name>
  7886.       | CHARACTER SET <character set name>
  7887.       | TRANSLATION <translation name>
  7888.  
  7889.   <grantee> ::=
  7890.         PUBLIC
  7891.       | <authorization identifier>
  7892.  
  7893.   <assertion definition> ::=
  7894.       CREATE ASSERTION <constraint name> <assertion check>
  7895.         [ <constraint attributes> ]
  7896.  
  7897.   <assertion check> ::=
  7898.       CHECK
  7899.           <left paren> <search condition> <right paren>
  7900.  
  7901.   <character set definition> ::=
  7902.       CREATE CHARACTER SET <character set name>
  7903.           [ AS ]
  7904.         <character set source>
  7905.         [ <collate clause> | <limited collation definition> ]
  7906.  
  7907.   <character set source> ::=
  7908.         GET <existing character set name>
  7909.  
  7910.   <existing character set name> ::=
  7911.         <standard character repertoire name>
  7912.       | <implementation-defined character repertoire name>
  7913.       | <schema character set name>
  7914.  
  7915.   <schema character set name> ::= <character set name>
  7916.  
  7917.   <limited collation definition> ::=
  7918.       COLLATION FROM <collation source>
  7919.  
  7920.   <collation source> ::=
  7921.         <collating sequence definition>
  7922.       | <translation collation>
  7923.  
  7924.   <collating sequence definition> ::=
  7925.         <external collation>
  7926.       | <schema collation name>
  7927.       | DESC <left paren> <collation name> <right paren>
  7928.       | DEFAULT
  7929.  
  7930.   <external collation> ::=
  7931.       EXTERNAL <left paren> <quote> <external collation name> <quote> <right paren>
  7932.  
  7933.   <external collation name> ::=
  7934.         <standard collation name>
  7935.       | <implementation-defined collation name>
  7936.  
  7937.   <standard collation name> ::= <collation name>
  7938.  
  7939.   <implementation-defined collation name> ::= <collation name>
  7940.  
  7941.   <schema collation name> ::= <collation name>
  7942.  
  7943.   <translation collation> ::=
  7944.       TRANSLATION <translation name>
  7945.           [ THEN COLLATION <collation name> ]
  7946.  
  7947.   <collation definition> ::=
  7948.       CREATE COLLATION <collation name> FOR
  7949.           <character set specification>
  7950.         FROM <collation source>
  7951.           [ <pad attribute> ]
  7952.  
  7953.   <pad attribute> ::=
  7954.         NO PAD
  7955.       | PAD SPACE
  7956.  
  7957.   <translation definition> ::=
  7958.       CREATE TRANSLATION <translation name>
  7959.         FOR <source character set specification>
  7960.           TO <target character set specification>
  7961.         FROM <translation source>
  7962.  
  7963.   <source character set specification> ::= <character set specification>
  7964.  
  7965.   <target character set specification> ::= <character set specification>
  7966.  
  7967.   <translation source> ::=
  7968.         <translation specification>
  7969.  
  7970.   <translation specification> ::=
  7971.         <external translation>
  7972.       | IDENTITY
  7973.       | <schema translation name>
  7974.  
  7975.   <external translation> ::=
  7976.       EXTERNAL <left paren> <quote> <external translation name> <quote> <right paren>
  7977.  
  7978.   <external translation name> ::=
  7979.         <standard translation name>
  7980.       | <implementation-defined translation name>
  7981.  
  7982.   <standard translation name> ::= <translation name>
  7983.  
  7984.   <implementation-defined translation name> ::= <translation name>
  7985.  
  7986.   <schema translation name> ::= <translation name>
  7987.  
  7988.   <SQL schema manipulation statement> ::=
  7989.         <drop schema statement>
  7990.       | <alter table statement>
  7991.       | <drop table statement>
  7992.       | <drop view statement>
  7993.       | <revoke statement>
  7994.       | <alter domain statement>
  7995.       | <drop domain statement>
  7996.       | <drop character set statement>
  7997.       | <drop collation statement>
  7998.       | <drop translation statement>
  7999.       | <drop assertion statement>
  8000.  
  8001.   <drop schema statement> ::=
  8002.       DROP SCHEMA <schema name> <drop behavior>
  8003.  
  8004.   <drop behavior> ::= CASCADE | RESTRICT
  8005.  
  8006.   <alter table statement> ::=
  8007.       ALTER TABLE <table name> <alter table action>
  8008.  
  8009.   <alter table action> ::=
  8010.         <add column definition>
  8011.       | <alter column definition>
  8012.       | <drop column definition>
  8013.       | <add table constraint definition>
  8014.       | <drop table constraint definition>
  8015.  
  8016.   <add column definition> ::=
  8017.       ADD [ COLUMN ] <column definition>
  8018.  
  8019.   <alter column definition> ::=
  8020.       ALTER [ COLUMN ] <column name> <alter column action>
  8021.  
  8022.   <alter column action> ::=
  8023.         <set column default clause>
  8024.       | <drop column default clause>
  8025.  
  8026.   <set column default clause> ::=
  8027.       SET <default clause>
  8028.  
  8029.   <drop column default clause> ::=
  8030.       DROP DEFAULT
  8031.  
  8032.   <drop column definition> ::=
  8033.       DROP [ COLUMN ] <column name> <drop behavior>
  8034.  
  8035.   <add table constraint definition> ::=
  8036.       ADD <table constraint definition>
  8037.  
  8038.   <drop table constraint definition> ::=
  8039.       DROP CONSTRAINT <constraint name> <drop behavior>
  8040.  
  8041.   <drop table statement> ::=
  8042.       DROP TABLE <table name> <drop behavior>
  8043.  
  8044.   <drop view statement> ::=
  8045.       DROP VIEW <table name> <drop behavior>
  8046.  
  8047.   <revoke statement> ::=
  8048.       REVOKE [ GRANT OPTION FOR ]
  8049.           <privileges>
  8050.           ON <object name>
  8051.         FROM <grantee> [ ( <comma> <grantee> )... ] <drop behavior>
  8052.  
  8053.   <alter domain statement> ::=
  8054.       ALTER DOMAIN <domain name> <alter domain action>
  8055.  
  8056.   <alter domain action> ::=
  8057.         <set domain default clause>
  8058.       | <drop domain default clause>
  8059.       | <add domain constraint definition>
  8060.       | <drop domain constraint definition>
  8061.  
  8062.   <set domain default clause> ::= SET <default clause>
  8063.  
  8064.   <drop domain default clause> ::= DROP DEFAULT
  8065.  
  8066.   <add domain constraint definition> ::=
  8067.       ADD <domain constraint>
  8068.  
  8069.   <drop domain constraint definition> ::=
  8070.       DROP CONSTRAINT <constraint name>
  8071.  
  8072.   <drop domain statement> ::=
  8073.       DROP DOMAIN <domain name> <drop behavior>
  8074.  
  8075.   <drop character set statement> ::=
  8076.       DROP CHARACTER SET <character set name>
  8077.  
  8078.   <drop collation statement> ::=
  8079.       DROP COLLATION <collation name>
  8080.  
  8081.   <drop translation statement> ::=
  8082.       DROP TRANSLATION <translation name>
  8083.  
  8084.   <drop assertion statement> ::=
  8085.       DROP ASSERTION <constraint name>
  8086.  
  8087.   <SQL data statement> ::=
  8088.         <open statement>
  8089.       | <fetch statement>
  8090.       | <close statement>
  8091.       | <select statement: single row>
  8092.       | <SQL data change statement>
  8093.  
  8094.   <open statement> ::=
  8095.       OPEN <cursor name>
  8096.  
  8097.   <fetch statement> ::=
  8098.       FETCH [ [ <fetch orientation> ] FROM ]
  8099.         <cursor name> INTO <fetch target list>
  8100.  
  8101.   <fetch orientation> ::=
  8102.         NEXT
  8103.       | PRIOR
  8104.       | FIRST
  8105.       | LAST
  8106.       | ( ABSOLUTE | RELATIVE ) <simple value specification>
  8107.  
  8108.   <simple value specification> ::=
  8109.         <parameter name>
  8110.       | <embedded variable name>
  8111.       | <literal>
  8112.  
  8113.   <fetch target list> ::=
  8114.       <target specification> [ ( <comma> <target specification> )... ]
  8115.  
  8116.   <target specification> ::=
  8117.         <parameter specification>
  8118.       | <variable specification>
  8119.  
  8120.   <close statement> ::=
  8121.       CLOSE <cursor name>
  8122.  
  8123.   <select statement: single row> ::=
  8124.       SELECT [ <set quantifier> ] <select list>
  8125.         INTO <select target list>
  8126.           <table expression>
  8127.  
  8128.   <select target list> ::=
  8129.       <target specification> [ ( <comma> <target specification> )... ]
  8130.  
  8131.   <SQL data change statement> ::=
  8132.         <delete statement: positioned>
  8133.       | <delete statement: searched>
  8134.       | <insert statement>
  8135.       | <update statement: positioned>
  8136.       | <update statement: searched>
  8137.  
  8138.   <delete statement: positioned> ::=
  8139.       DELETE FROM <table name>
  8140.         WHERE CURRENT OF <cursor name>
  8141.  
  8142.   <delete statement: searched> ::=
  8143.       DELETE FROM <table name>
  8144.         [ WHERE <search condition> ]
  8145.  
  8146.   <insert statement> ::=
  8147.       INSERT INTO <table name>
  8148.         <insert columns and source>
  8149.  
  8150.   <insert columns and source> ::=
  8151.         [ <left paren> <insert column list> <right paren> ]
  8152.               <query expression>
  8153.       | DEFAULT VALUES
  8154.  
  8155.   <insert column list> ::= <column name list>
  8156.  
  8157.   <update statement: positioned> ::=
  8158.       UPDATE <table name>
  8159.         SET <set clause list>
  8160.           WHERE CURRENT OF <cursor name>
  8161.  
  8162.   <set clause list> ::=
  8163.       <set clause> [ ( <comma> <set clause> )... ]
  8164.  
  8165.   <set clause> ::=
  8166.       <object column> <equals operator> <update source>
  8167.  
  8168.   <object column> ::= <column name>
  8169.  
  8170.   <update source> ::=
  8171.         <value expression>
  8172.       | <null specification>
  8173.       | DEFAULT
  8174.  
  8175.   <update statement: searched> ::=
  8176.       UPDATE <table name>
  8177.         SET <set clause list>
  8178.         [ WHERE <search condition> ]
  8179.  
  8180.   <SQL transaction statement> ::=
  8181.         <set transaction statement>
  8182.       | <set constraints mode statement>
  8183.       | <commit statement>
  8184.       | <rollback statement>
  8185.  
  8186.   <set transaction statement> ::=
  8187.       SET TRANSACTION <transaction mode>
  8188.           [ ( <comma> <transaction mode> )... ]
  8189.  
  8190.   <transaction mode> ::=
  8191.         <isolation level>
  8192.       | <transaction access mode>
  8193.       | <diagnostics size>
  8194.  
  8195.   <isolation level> ::=
  8196.       ISOLATION LEVEL <level of isolation>
  8197.  
  8198.   <level of isolation> ::=
  8199.         READ UNCOMMITTED
  8200.       | READ COMMITTED
  8201.       | REPEATABLE READ
  8202.       | SERIALIZABLE
  8203.  
  8204.   <transaction access mode> ::=
  8205.         READ ONLY
  8206.       | READ WRITE
  8207.  
  8208.   <diagnostics size> ::=
  8209.       DIAGNOSTICS SIZE <number of conditions>
  8210.  
  8211.   <number of conditions> ::= <simple value specification>
  8212.  
  8213.   <set constraints mode statement> ::=
  8214.       SET CONSTRAINTS <constraint name list>
  8215.           ( DEFERRED | IMMEDIATE )
  8216.  
  8217.   <constraint name list> ::=
  8218.         ALL
  8219.       | <constraint name> [ ( <comma> <constraint name> )... ]
  8220.  
  8221.   <commit statement> ::=
  8222.       COMMIT [ WORK ]
  8223.  
  8224.   <rollback statement> ::=
  8225.       ROLLBACK [ WORK ]
  8226.  
  8227.   <SQL connection statement> ::=
  8228.         <connect statement>
  8229.       | <set connection statement>
  8230.       | <disconnect statement>
  8231.  
  8232.   <connect statement> ::=
  8233.       CONNECT TO <connection target>
  8234.  
  8235.   <connection target> ::=
  8236.         <SQL-server name>
  8237.           [ AS <connection name> ]
  8238.             correspondence with Tony Gordon)
  8239.           [ USER <user name> ]
  8240.       | DEFAULT
  8241.  
  8242.   <SQL-server name> ::= <simple value specification>
  8243.  
  8244.   <connection name> ::= <simple value specification>
  8245.  
  8246.   <user name> ::= <simple value specification>
  8247.  
  8248.   <set connection statement> ::=
  8249.       SET CONNECTION <connection object>
  8250.  
  8251.   <connection object> ::=
  8252.         DEFAULT
  8253.       | <connection name>
  8254.  
  8255.   <disconnect statement> ::=
  8256.       DISCONNECT <disconnect object>
  8257.  
  8258.   <disconnect object> ::=
  8259.         <connection object>
  8260.       | ALL
  8261.       | CURRENT
  8262.  
  8263.   <SQL session statement> ::=
  8264.         <set catalog statement>
  8265.       | <set schema statement>
  8266.       | <set names statement>
  8267.       | <set session authorization identifier statement>
  8268.       | <set local time zone statement>
  8269.  
  8270.   <set catalog statement> ::=
  8271.       SET CATALOG <value specification>
  8272.  
  8273.   <value specification> ::=
  8274.         <literal>
  8275.       | <general value specification>
  8276.  
  8277.   <set schema statement> ::=
  8278.       SET SCHEMA <value specification>
  8279.  
  8280.   <set names statement> ::=
  8281.       SET NAMES <value specification>
  8282.  
  8283.   <set session authorization identifier statement> ::=
  8284.       SET SESSION AUTHORIZATION
  8285.           <value specification>
  8286.  
  8287.   <set local time zone statement> ::=
  8288.       SET TIME ZONE
  8289.           <set time zone value>
  8290.   <set time zone value> ::=
  8291.         <interval value expression>
  8292.       | LOCAL
  8293.  
  8294.   <SQL dynamic statement> ::=
  8295.         <system descriptor statement>
  8296.       | <prepare statement>
  8297.       | <deallocate prepared statement>
  8298.       | <describe statement>
  8299.       | <execute statement>
  8300.       | <execute immediate statement>
  8301.       | <SQL dynamic data statement>
  8302.  
  8303.   <system descriptor statement> ::=
  8304.         <allocate descriptor statement>
  8305.       | <deallocate descriptor statement>
  8306.       | <set descriptor statement>
  8307.       | <get descriptor statement>
  8308.  
  8309.   <allocate descriptor statement> ::=
  8310.       ALLOCATE DESCRIPTOR <descriptor name>
  8311.          [ WITH MAX <occurrences> ]
  8312.  
  8313.   <descriptor name> ::=
  8314.       [ <scope option> ] <simple value specification>
  8315.  
  8316.   <scope option> ::=
  8317.         GLOBAL
  8318.       | LOCAL
  8319.  
  8320.   <occurrences> ::= <simple value specification>
  8321.  
  8322.   <deallocate descriptor statement> ::=
  8323.       DEALLOCATE DESCRIPTOR <descriptor name>
  8324.  
  8325.   <set descriptor statement> ::=
  8326.       SET DESCRIPTOR <descriptor name>
  8327.           <set descriptor information>
  8328.  
  8329.   <set descriptor information> ::=
  8330.         <set count>
  8331.       | VALUE <item number>
  8332.           <set item information> [ ( <comma> <set item information> )... ]
  8333.  
  8334.   <set count> ::=
  8335.       COUNT <equals operator> <simple value specification 1>
  8336.  
  8337.   <simple value specification 1> ::= <simple value specification>
  8338.  
  8339.   <item number> ::= <simple value specification>
  8340.  
  8341.   <set item information> ::=
  8342.       <descriptor item name> <equals operator> <simple value specification 2>
  8343.  
  8344.   <descriptor item name> ::=
  8345.         TYPE
  8346.       | LENGTH
  8347.       | OCTET_LENGTH
  8348.       | RETURNED_LENGTH
  8349.       | RETURNED_OCTET_LENGTH
  8350.       | PRECISION
  8351.       | SCALE
  8352.       | DATETIME_INTERVAL_CODE
  8353.       | DATETIME_INTERVAL_PRECISION
  8354.       | NULLABLE
  8355.       | INDICATOR
  8356.       | DATA
  8357.       | NAME
  8358.       | UNNAMED
  8359.       | COLLATION_CATALOG
  8360.       | COLLATION_SCHEMA
  8361.       | COLLATION_NAME
  8362.       | CHARACTER_SET_CATALOG
  8363.       | CHARACTER_SET_SCHEMA
  8364.       | CHARACTER_SET_NAME
  8365.  
  8366.   <simple value specification 2> ::= <simple value specification>
  8367.  
  8368.   <item number> ::= <simple value specification>
  8369.  
  8370.   <get descriptor statement> ::=
  8371.       GET DESCRIPTOR <descriptor name> <get descriptor information>
  8372.  
  8373.   <get descriptor information> ::=
  8374.         <get count>
  8375.       | VALUE <item number>
  8376.           <get item information> [ ( <comma> <get item information> )... ]
  8377.  
  8378.   <get count> ::=
  8379.       <simple target specification 1> <equals operator>
  8380.            COUNT
  8381.  
  8382.   <simple target specification 1> ::= <simple target specification>
  8383.  
  8384.   <simple target specification> ::=
  8385.         <parameter name>
  8386.       | <embedded variable name>
  8387.  
  8388.   <get item information> ::=
  8389.       <simple target specification 2> <equals operator> <descriptor item name>>
  8390.  
  8391.   <simple target specification 2> ::= <simple target specification>
  8392.  
  8393.   <prepare statement> ::=
  8394.       PREPARE <SQL statement name> FROM <SQL statement variable>
  8395.  
  8396.   <SQL statement name> ::=
  8397.         <statement name>
  8398.       | <extended statement name>
  8399.  
  8400.   <extended statement name> ::=
  8401.       [ <scope option> ] <simple value specification>
  8402.  
  8403.   <SQL statement variable> ::= <simple value specification>
  8404.  
  8405.   <deallocate prepared statement> ::=
  8406.       DEALLOCATE PREPARE <SQL statement name>
  8407.  
  8408.   <describe statement> ::=
  8409.         <describe input statement>
  8410.       | <describe output statement>
  8411.  
  8412.   <describe input statement> ::=
  8413.       DESCRIBE INPUT <SQL statement name> <using descriptor>
  8414.  
  8415.   <using descriptor> ::=
  8416.       ( USING | INTO ) SQL DESCRIPTOR <descriptor name>
  8417.  
  8418.   <describe output statement> ::=
  8419.       DESCRIBE [ OUTPUT ] <SQL statement name> <using descriptor>
  8420.  
  8421.   <execute statement> ::=
  8422.       EXECUTE <SQL statement name>
  8423.         [ <result using clause> ]
  8424.         [ <parameter using clause> ]
  8425.  
  8426.   <result using clause> ::= <using clause>
  8427.  
  8428.   <using clause> ::=
  8429.         <using arguments>
  8430.       | <using descriptor>
  8431.  
  8432.   <using arguments> ::=
  8433.       ( USING | INTO ) <argument> [ ( <comma> <argument> )... ]
  8434.  
  8435.   <argument> ::= <target specification>
  8436.  
  8437.   <parameter using clause> ::= <using clause>
  8438.  
  8439.   <execute immediate statement> ::=
  8440.       EXECUTE IMMEDIATE <SQL statement variable>
  8441.  
  8442.   <SQL dynamic data statement> ::=
  8443.         <allocate cursor statement>
  8444.       | <dynamic open statement>
  8445.       | <dynamic fetch statement>
  8446.       | <dynamic close statement>
  8447.       | <dynamic delete statement: positioned>
  8448.       | <dynamic update statement: positioned>
  8449.  
  8450.   <allocate cursor statement> ::=
  8451.       ALLOCATE <extended cursor name> [ INSENSITIVE ]
  8452.           [ SCROLL ] CURSOR
  8453.         FOR <extended statement name>
  8454.  
  8455.   <extended cursor name> ::=
  8456.       [ <scope option> ] <simple value specification>
  8457.  
  8458.   <dynamic open statement> ::=
  8459.       OPEN <dynamic cursor name> [ <using clause> ]
  8460.  
  8461.   <dynamic cursor name> ::=
  8462.         <cursor name>
  8463.       | <extended cursor name>
  8464.  
  8465.   <dynamic fetch statement> ::=
  8466.       FETCH [ [ <fetch orientation> ] FROM ] <dynamic cursor name>
  8467.           <using clause>
  8468.  
  8469.   <dynamic close statement> ::=
  8470.       CLOSE <dynamic cursor name>
  8471.  
  8472.   <dynamic delete statement: positioned> ::=
  8473.       DELETE FROM <table name>
  8474.         WHERE CURRENT OF
  8475.             <dynamic cursor name>
  8476.  
  8477.   <dynamic update statement: positioned> ::=
  8478.       UPDATE <table name>
  8479.         SET <set clause>
  8480.             [ ( <comma> <set clause> )... ]
  8481.           WHERE CURRENT OF
  8482.               <dynamic cursor name>
  8483.  
  8484.   <SQL diagnostics statement> ::=
  8485.       <get diagnostics statement>
  8486.  
  8487.   <get diagnostics statement> ::=
  8488.       GET DIAGNOSTICS <sql diagnostics information>
  8489.  
  8490.   <sql diagnostics information> ::=
  8491.         <statement information>
  8492.       | <condition information>
  8493.  
  8494.   <statement information> ::=
  8495.       <statement information item> [ ( <comma> <statement information item> )... ]
  8496.  
  8497.   <statement information item> ::=
  8498.       <simple target specification> <equals operator> <statement information item name>
  8499.  
  8500.   <statement information item name> ::=
  8501.         NUMBER
  8502.       | MORE
  8503.       | COMMAND_FUNCTION
  8504.       | DYNAMIC_FUNCTION
  8505.       | ROW_COUNT
  8506.  
  8507.   <condition information> ::=
  8508.       EXCEPTION <condition number>
  8509.         <condition information item> [ ( <comma> <condition information item> )... ]
  8510.  
  8511.   <condition number> ::= <simple value specification>
  8512.  
  8513.   <condition information item> ::=
  8514.       <simple target specification> <equals operator> <condition information item name>
  8515.  
  8516.   <condition information item name> ::=
  8517.         CONDITION_NUMBER
  8518.       | RETURNED_SQLSTATE
  8519.       | CLASS_ORIGIN
  8520.       | SUBCLASS_ORIGIN
  8521.       | SERVER_NAME
  8522.       | CONNECTION_NAME
  8523.       | CONSTRAINT_CATALOG
  8524.       | CONSTRAINT_SCHEMA
  8525.       | CONSTRAINT_NAME
  8526.       | CATALOG_NAME
  8527.       | SCHEMA_NAME
  8528.       | TABLE_NAME
  8529.       | COLUMN_NAME
  8530.       | CURSOR_NAME
  8531.       | MESSAGE_TEXT
  8532.       | MESSAGE_LENGTH
  8533.       | MESSAGE_OCTET_LENGTH
  8534.  
  8535.   <embedded SQL host program> ::=
  8536.         <embedded SQL Ada program>
  8537.       | <embedded SQL C program>
  8538.       | <embedded SQL COBOL program>
  8539.       | <embedded SQL Fortran program>
  8540.       | <embedded SQL MUMPS program>
  8541.       | <embedded SQL Pascal program>
  8542.       | <embedded SQL PL/I program>
  8543.  
  8544.   <embedded SQL Ada program> ::= !! <EMPHASIS>(See the Syntax Rules.)
  8545.  
  8546.   <embedded SQL C program> ::=
  8547.         !! <EMPHASIS>(See the Syntax Rules.)
  8548.  
  8549.   <embedded SQL COBOL program> ::= !! <EMPHASIS>(See the Syntax Rules.)
  8550.  
  8551.   <embedded SQL Fortran program> ::=
  8552.       !! <EMPHASIS>(See the Syntax Rules.)
  8553.  
  8554.   <embedded SQL MUMPS program> ::= !! <EMPHASIS>(See the Syntax Rules.)
  8555.  
  8556.   <embedded SQL Pascal program> ::=
  8557.       !! <EMPHASIS>(See the Syntax Rules.)
  8558.  
  8559.   <embedded SQL PL/I program> ::= !! <EMPHASIS>(See the Syntax Rules.)
  8560.  
  8561.   <embedded SQL declare section> ::=
  8562.         <embedded SQL begin declare>
  8563.           [ <embedded character set declaration> ]
  8564.           [ <host variable definition>... ]
  8565.         <embedded SQL end declare>
  8566.       | <embedded SQL MUMPS declare>
  8567.  
  8568.   <embedded SQL begin declare> ::=
  8569.       <SQL prefix> BEGIN DECLARE SECTION
  8570.           [ <SQL terminator> ]
  8571.  
  8572.   <SQL prefix> ::=
  8573.         EXEC SQL
  8574.       | <ampersand>SQL<left paren>
  8575.  
  8576.   <SQL terminator> ::=
  8577.         END-EXEC
  8578.       | <semicolon>
  8579.       | <right paren>
  8580.  
  8581.   <embedded character set declaration> ::=
  8582.       SQL NAMES ARE <character set specification>
  8583.  
  8584.   <host variable definition> ::=
  8585.         <Ada variable definition>
  8586.       | <C variable definition>
  8587.       | <COBOL variable definition>
  8588.       | <Fortran variable definition>
  8589.       | <MUMPS variable definition>
  8590.       | <Pascal variable definition>
  8591.       | <PL/I variable definition>
  8592.  
  8593.   <Ada variable definition> ::=
  8594.       <Ada host identifier> [ ( <comma> <Ada host identifier> )... ] :
  8595.       <Ada type specification> [ <Ada initial value> ]
  8596.  
  8597.   <Ada type specification> ::=
  8598.         <Ada qualified type specification>
  8599.       | <Ada unqualified type specification>
  8600.  
  8601.   <Ada qualified type specification> ::=
  8602.         SQL_STANDARD.CHAR [ CHARACTER SET
  8603.            [ IS ] <character set specification> ]
  8604.             <left paren> 1 <double period> <length> <right paren>
  8605.       | SQL_STANDARD.BIT
  8606.             <left paren> 1 <double period> <length> <right paren>
  8607.       | SQL_STANDARD.SMALLINT
  8608.       | SQL_STANDARD.INT
  8609.       | SQL_STANDARD.REAL
  8610.       | SQL_STANDARD.DOUBLE_PRECISION
  8611.       | SQL_STANDARD.SQLCODE_TYPE
  8612.       | SQL_STANDARD.SQLSTATE_TYPE
  8613.       | SQL_STANDARD.INDICATOR_TYPE
  8614.  
  8615.   <Ada unqualified type specification> ::=
  8616.         CHAR
  8617.             <left paren> 1 <double period> <length> <right paren>
  8618.       | BIT
  8619.             <left paren> 1 <double period> <length> <right paren>
  8620.       | SMALLINT
  8621.       | INT
  8622.       | REAL
  8623.       | DOUBLE_PRECISION
  8624.       | SQLCODE_TYPE
  8625.       | SQLSTATE_TYPE
  8626.       | INDICATOR_TYPE
  8627.  
  8628.   <Ada initial value> ::=
  8629.       <Ada assignment operator> <character representation>...
  8630.  
  8631.   <Ada assignment operator> ::= <colon><equals operator>
  8632.  
  8633.   <C variable definition> ::=
  8634.         [ <C storage class> ]
  8635.         [ <C class modifier> ]
  8636.         <C variable specification>
  8637.       <semicolon>
  8638.  
  8639.   <C storage class> ::=
  8640.         auto
  8641.       | extern
  8642.       | static
  8643.  
  8644.   <C class modifier> ::= const | volatile
  8645.  
  8646.   <C variable specification> ::=
  8647.         <C numeric variable>
  8648.       | <C character variable>
  8649.       | <C derived variable>
  8650.  
  8651.   <C numeric variable> ::=
  8652.       ( long | short | float | double )
  8653.         <C host identifier> [ <C initial value> ]
  8654.               [ ( <comma> <C host identifier> [ <C initial value> ] )... ]
  8655.  
  8656.   <C initial value> ::=
  8657.       <equals operator> <character representation>...
  8658.  
  8659.   <C character variable> ::=
  8660.       char [ CHARACTER SET
  8661.                [ IS ] <character set specification> ]
  8662.         <C host identifier>
  8663.           <C array specification> [ <C initial value> ]
  8664.           [ ( <comma> <C host identifier>
  8665.             <C array specification>
  8666.                    [ <C initial value> ] )... ]
  8667.  
  8668.   <C array specification> ::=
  8669.       <left bracket> <length> <right bracket>
  8670.  
  8671.   <C derived variable> ::=
  8672.         <C VARCHAR variable>
  8673.       | <C bit variable>
  8674.  
  8675.   <C VARCHAR variable> ::=
  8676.       VARCHAR [ CHARACTER SET [ IS ]
  8677.           <character set specification> ]
  8678.           <C host identifier>
  8679.               <C array specification> [ <C initial value> ]
  8680.             [ ( <comma> <C host identifier>
  8681.                 <C array specification>
  8682.                         [ <C initial value> ] )... ]
  8683.  
  8684.   <C bit variable> ::=
  8685.       BIT <C host identifier>
  8686.           <C array specification> [ <C initial value> ]
  8687.         [ ( <comma> <C host identifier>
  8688.           <C array specification>
  8689.                      [ <C initial value> ] )... ]
  8690.  
  8691.   <COBOL variable definition> ::=
  8692.       (01|77) <COBOL host identifier> <COBOL type specification>
  8693.         [ <character representation>... ] <period>
  8694.  
  8695.   <COBOL type specification> ::=
  8696.         <COBOL character type>
  8697.       | <COBOL bit type>
  8698.       | <COBOL numeric type>
  8699.       | <COBOL integer type>
  8700.  
  8701.   <COBOL character type> ::=
  8702.       [ CHARACTER SET [ IS ]
  8703.             <character set specification> ]
  8704.       ( PIC | PICTURE ) [ IS ] ( X [ <left paren> <length> <right paren> ] )...
  8705.  
  8706.   <COBOL bit type> ::=
  8707.       ( PIC | PICTURE ) [ IS ]
  8708.           ( B [ <left paren> <length> <right paren> ] )...
  8709.  
  8710.   <COBOL numeric type> ::=
  8711.       ( PIC | PICTURE ) [ IS ]
  8712.         S <COBOL nines specification>
  8713.       [ USAGE [ IS ] ] DISPLAY SIGN LEADING SEPARATE
  8714.  
  8715.   <COBOL nines specification> ::=
  8716.         <COBOL nines> [ V [ <COBOL nines> ] ]
  8717.       | V <COBOL nines>
  8718.  
  8719.   <COBOL nines> ::= ( 9 [ <left paren> <length> <right paren> ] )...
  8720.  
  8721.   <COBOL integer type> ::=
  8722.         <COBOL computational integer>
  8723.       | <COBOL binary integer>
  8724.  
  8725.   <COBOL computational integer> ::=
  8726.       ( PIC | PICTURE ) [ IS ] S<COBOL nines>
  8727.         [ USAGE [ IS ] ] ( COMP | COMPUTATIONAL )
  8728.  
  8729.   <COBOL binary integer> ::=
  8730.       ( PIC | PICTURE ) [ IS ] S<COBOL nines>
  8731.         [ USAGE [ IS ] ] BINARY
  8732.  
  8733.   <Fortran variable definition> ::=
  8734.       <Fortran type specification>
  8735.       <Fortran host identifier>
  8736.           [ ( <comma> <Fortran host identifier> )... ]
  8737.  
  8738.   <Fortran type specification> ::=
  8739.         CHARACTER [ <asterisk> <length> ]
  8740.             [ CHARACTER SET [ IS ]
  8741.                   <character set specification> ]
  8742.       | BIT [ <asterisk> <length> ]
  8743.       | INTEGER
  8744.       | REAL
  8745.       | DOUBLE PRECISION
  8746.  
  8747.   <MUMPS variable definition> ::=
  8748.       ( <MUMPS numeric variable> | <MUMPS character variable> )
  8749.           <semicolon>
  8750.  
  8751.   <MUMPS numeric variable> ::=
  8752.       <MUMPS type specification>
  8753.         <MUMPS host identifier> [ ( <comma> <MUMPS host identifier> )... ]
  8754.  
  8755.   <MUMPS type specification> ::=
  8756.         INT
  8757.       | DEC
  8758.             [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  8759.       | REAL
  8760.  
  8761.   <MUMPS character variable> ::=
  8762.       VARCHAR <MUMPS host identifier> <MUMPS length specification>
  8763.         [ ( <comma> <MUMPS host identifier> <MUMPS length specification> )... ]
  8764.  
  8765.   <MUMPS length specification> ::=
  8766.       <left paren> <length> <right paren>
  8767.  
  8768.   <Pascal variable definition> ::=
  8769.       <Pascal host identifier> [ ( <comma> <Pascal host identifier> )... ] <colon>
  8770.         <Pascal type specification> <semicolon>
  8771.  
  8772.   <Pascal type specification> ::=
  8773.         PACKED ARRAY
  8774.             <left bracket> 1 <double period> <length> <right bracket>
  8775.           OF CHAR
  8776.             [ CHARACTER SET [ IS ]
  8777.                   <character set specification> ]
  8778.       | PACKED ARRAY
  8779.             <left bracket> 1 <double period> <length> <right bracket>
  8780.           OF BIT
  8781.       | INTEGER
  8782.       | REAL
  8783.       | CHAR [ CHARACTER SET
  8784.                                   [ IS ] <character set specification> ]
  8785.       | BIT
  8786.  
  8787.   <PL/I variable definition> ::=
  8788.       (DCL | DECLARE)
  8789.           (   <PL/I host identifier>
  8790.             | <left paren> <PL/I host identifier>
  8791.                   [ ( <comma> <PL/I host identifier> )... ] <right paren> )
  8792.       <PL/I type specification>
  8793.       [ <character representation>... ] <semicolon>
  8794.  
  8795.   <PL/I type specification> ::=
  8796.         ( CHAR | CHARACTER ) [ VARYING ]
  8797.             <left paren><length><right paren>
  8798.             [ CHARACTER SET
  8799.                   [ IS ] <character set specification> ]
  8800.       | BIT [ VARYING ] <left paren><length><right paren>
  8801.       | <PL/I type fixed decimal> <left paren> <precision>
  8802.             [ <comma> <scale> ] <right paren>
  8803.       | <PL/I type fixed binary> [ <left paren> <precision> <right paren> ]
  8804.       | <PL/I type float binary> <left paren> <precision> <right paren>
  8805.  
  8806.   <PL/I type fixed decimal> ::=
  8807.         ( DEC | DECIMAL ) FIXED
  8808.       | FIXED ( DEC | DECIMAL )
  8809.  
  8810.   <PL/I type fixed binary> ::=
  8811.         ( BIN | BINARY ) FIXED
  8812.       | FIXED ( BIN | BINARY )
  8813.  
  8814.   <PL/I type float binary> ::=
  8815.         ( BIN | BINARY ) FLOAT
  8816.       | FLOAT ( BIN | BINARY )
  8817.  
  8818.   <embedded SQL end declare> ::=
  8819.       <SQL prefix> END DECLARE SECTION
  8820.           [ <SQL terminator> ]
  8821.  
  8822.   <embedded SQL MUMPS declare> ::=
  8823.       <SQL prefix>
  8824.         BEGIN DECLARE SECTION
  8825.           [ <embedded character set declaration> ]
  8826.           [ <host variable definition>... ]
  8827.         END DECLARE SECTION
  8828.       <SQL terminator>
  8829.  
  8830.   <embedded SQL statement> ::=
  8831.       <SQL prefix>
  8832.         <statement or declaration>
  8833.       [ <SQL terminator> ]
  8834.  
  8835.   <statement or declaration> ::=
  8836.         <declare cursor>
  8837.       | <dynamic declare cursor>
  8838.       | <temporary table declaration>
  8839.       | <embedded exception declaration>
  8840.       | <SQL procedure statement>
  8841.  
  8842.   <embedded exception declaration> ::=
  8843.       WHENEVER <condition> <condition action>
  8844.  
  8845.   <condition> ::=
  8846.       SQLERROR | NOT FOUND
  8847.  
  8848.   <condition action> ::=
  8849.       CONTINUE | <go to>
  8850.  
  8851.   <go to> ::=
  8852.       ( GOTO | GO TO ) <goto target>
  8853.  
  8854.   <goto target> ::=
  8855.         <host label identifier>
  8856.       | <unsigned integer>
  8857.       | <host PL/I label variable>
  8858.  
  8859.   <host label identifier> ::= !!<EMPHASIS>(See the Syntax Rules.)
  8860.  
  8861.   <host PL/I label variable> ::= !!<EMPHASIS>(See the Syntax Rules.)
  8862.  
  8863.   <preparable statement> ::=
  8864.         <preparable SQL data statement>
  8865.       | <preparable SQL schema statement>
  8866.       | <preparable SQL transaction statement>
  8867.       | <preparable SQL session statement>
  8868.       | <preparable implementation-defined statement>
  8869.  
  8870.   <preparable SQL data statement> ::=
  8871.         <delete statement: searched>
  8872.       | <dynamic single row select statement>
  8873.       | <insert statement>
  8874.       | <dynamic select statement>
  8875.       | <update statement: searched>
  8876.       | <preparable dynamic delete statement: positioned>
  8877.       | <preparable dynamic update statement: positioned>
  8878.  
  8879.   <dynamic single row select statement> ::= <query specification>
  8880.  
  8881.   <dynamic select statement> ::= <cursor specification>
  8882.  
  8883.   <preparable dynamic delete statement: positioned> ::=
  8884.      DELETE [ FROM <table name> ]
  8885.         WHERE CURRENT OF <cursor name>
  8886.  
  8887.   <preparable dynamic update statement: positioned> ::=
  8888.      UPDATE [ <table name> ]
  8889.         SET <set clause list>
  8890.         WHERE CURRENT OF <cursor name>
  8891.  
  8892.   <preparable SQL schema statement> ::=
  8893.         <SQL schema statement>
  8894.  
  8895.   <preparable SQL transaction statement> ::=
  8896.         <SQL transaction statement>
  8897.  
  8898.   <preparable SQL session statement> ::=
  8899.         <SQL session statement>
  8900.  
  8901.   <preparable implementation-defined statement> ::=
  8902.       !! <EMPHASIS>(See the Syntax Rules.)
  8903.  
  8904.   <direct SQL statement> ::=
  8905.       <directly executable statement> <semicolon>
  8906.  
  8907.   <directly executable statement> ::=
  8908.         <direct SQL data statement>
  8909.       | <SQL schema statement>
  8910.       | <SQL transaction statement>
  8911.       | <SQL connection statement>
  8912.       | <SQL session statement>
  8913.       | <direct implementation-defined statement>
  8914.  
  8915.   <direct SQL data statement> ::=
  8916.         <delete statement: searched>
  8917.       | <direct select statement: multiple rows>
  8918.       | <insert statement>
  8919.       | <update statement: searched>
  8920.       | <temporary table declaration>
  8921.  
  8922.   <direct select statement: multiple rows> ::=
  8923.       <query expression> [ <order by clause> ]
  8924.  
  8925.   <direct implementation-defined statement> ::=
  8926.       !!<EMPHASIS>(See the Syntax Rules)
  8927.  
  8928.   <SQL object identifier> ::=
  8929.       <SQL provenance> <SQL variant>
  8930.  
  8931.   <SQL provenance> ::= <arc1> <arc2> <arc3>
  8932.  
  8933.   <arc1> ::= iso | 1 | iso <left paren> 1 <right paren>
  8934.  
  8935.   <arc2> ::= standard | 0 | standard <left paren> 0 <right paren>
  8936.  
  8937.   <arc3> ::= 9075
  8938.  
  8939.   <SQL variant> ::= <SQL edition> <SQL conformance>
  8940.  
  8941.   <SQL edition> ::= <1987> | <1989> | <1992>
  8942.  
  8943.   <1987> ::= 0 | edition1987 <left paren> 0 <right paren>
  8944.  
  8945.   <1989> ::= <1989 base> <1989 package>
  8946.  
  8947.   <1989 base> ::= 1 | edition1989 <left paren> 1 <right paren>
  8948.  
  8949.   <1989 package> ::= <integrity no> | <integrity yes>
  8950.   <integrity no> ::= 0 | IntegrityNo <left paren> 0 <right paren>
  8951.  
  8952.   <integrity yes> ::= 1 | IntegrityYes <left paren> 1 <right paren>
  8953.  
  8954.   <1992> ::= 2 | edition1992 <left paren> 2 <right paren>
  8955.  
  8956.   <SQL conformance> ::= <low> | <intermediate> | <high>
  8957.  
  8958.   <low> ::= 0 | Low <left paren> 0 <right paren>
  8959.  
  8960.   <intermediate> ::= 1 | Intermediate <left paren> 1 <right paren>
  8961.  
  8962.   <high> ::= 2 | High <left paren> 2 <right paren>
  8963.  
  8964.   43.  Appendix B - Syntax of ANSI/ISO SQL 1998
  8965.  
  8966.   SQL syntax specification for ANSI/ISO SQL 1998 also called SQL-3 as below -
  8967.   Under is a copy of the SQL3 bnf.  SQL3 is a superset of SQL-92
  8968.   [which is a superset of SQL-89 level 2].  SQL3 is not yet a standard,
  8969.   but SQL-92 is a standard.
  8970.   ENTRY LEVEL SQL-92 is the "current" implementation state of most
  8971.   vendors.  There are only a few differences between SQL-92 ENTRY LEVEL
  8972.   and SQL-89 Level II, but two of them are very important:
  8973.  
  8974.      - Delimited identifiers
  8975.  
  8976.      - The handling of the WITH CHECK option on views defaults to
  8977.        CASCADE.  In SQL-89 the default was [effectively] LOCAL.
  8978.  
  8979.   for the  language done at about  1-SEP-1993 15:13:55.88.
  8980.   The specific version of the BNF included here is:  ANSI-only, SQL3-only.
  8981.  
  8982.   <SQL terminal character> ::=
  8983.       <SQL language character>
  8984.  
  8985.   <SQL language character> ::=
  8986.         <simple Latin letter>
  8987.       | <digit>
  8988.       | <SQL special character>
  8989.  
  8990.   <simple Latin letter> ::=
  8991.         <simple Latin upper case letter>
  8992.       | <simple Latin lower case letter>
  8993.  
  8994.   <simple Latin upper case letter> ::=
  8995.             A | B | C | D | E | F | G | H | I | J | K | L | M | N | O
  8996.       | P | Q | R | S | T | U | V | W | X | Y | Z
  8997.  
  8998.   <simple Latin lower case letter> ::=
  8999.             a | b | c | d | e | f | g | h | i | j | k | l | m | n | o
  9000.       | p | q | r | s | t | u | v | w | x | y | z
  9001.  
  9002.   <digit> ::=
  9003.       0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
  9004.  
  9005.   <SQL special character> ::=
  9006.         <space>
  9007.       | <double quote>
  9008.       | <percent>
  9009.       | <ampersand>
  9010.       | <quote>
  9011.       | <left paren>
  9012.       | <right paren>
  9013.       | <asterisk>
  9014.       | <plus sign>
  9015.       | <comma>
  9016.       | <minus sign>
  9017.       | <period>
  9018.       | <solidus>
  9019.       | <colon>
  9020.       | <semicolon>
  9021.       | <less than operator>
  9022.       | <equals operator>
  9023.       | <greater than operator>
  9024.       | <question mark>
  9025.       | <left bracket>
  9026.       | <right bracket>
  9027.       | <circumflex>
  9028.       | <underscore>
  9029.       | <vertical bar>
  9030.  
  9031.   <space> ::= !! <EMPHASIS>(space character in character set in use)
  9032.  
  9033.   <double quote> ::= "
  9034.  
  9035.   <percent> ::= %
  9036.  
  9037.   <ampersand> ::= &
  9038.  
  9039.   <quote> ::= '
  9040.  
  9041.   <left paren> ::= (
  9042.  
  9043.   <right paren> ::= )
  9044.  
  9045.   <asterisk> ::= *
  9046.  
  9047.   <plus sign> ::= +
  9048.  
  9049.   <comma> ::= ,
  9050.  
  9051.   <minus sign> ::= -
  9052.  
  9053.   <period> ::= .
  9054.  
  9055.   <solidus> ::= /
  9056.  
  9057.   <colon> ::= :
  9058.  
  9059.   <semicolon> ::= ;
  9060.  
  9061.   <less than operator> ::= <
  9062.  
  9063.   <equals operator> ::= =
  9064.  
  9065.   <greater than operator> ::= >
  9066.  
  9067.   <question mark> ::= ?
  9068.  
  9069.   <left bracket> ::= [
  9070.  
  9071.   <right bracket> ::= ]
  9072.  
  9073.   <circumflex> ::= ^
  9074.  
  9075.   <underscore> ::= _
  9076.  
  9077.   <vertical bar> ::= |
  9078.  
  9079.   <separator> ::= ( <comment> | <space> | <newline> )...
  9080.  
  9081.   <comment> ::=
  9082.         <simple comment>
  9083.       | <bracketed comment>
  9084.  
  9085.   <simple comment> ::=
  9086.       <simple comment introducer> [ <comment character>... ] <newline>
  9087.  
  9088.   <simple comment introducer> ::= <minus sign><minus sign>[<minus sign>...]
  9089.  
  9090.   <comment character> ::=
  9091.         <nonquote character>
  9092.       | <quote>
  9093.  
  9094.   <nonquote character> ::= !! <EMPHASIS>(See the Syntax Rules.)
  9095.  
  9096.   <newline> ::= !! <EMPHASIS>(implementation-defined end-of-line indicator)
  9097.   <bracketed comment> ::=             !! (<EMPHASIS>(See the Syntax Rules))
  9098.       <bracketed comment introducer>
  9099.         <bracketed comment contents>
  9100.       <bracketed comment terminator>
  9101.  
  9102.   <bracketed comment introducer> ::= <solidus><asterisk>
  9103.  
  9104.   <bracketed comment contents> ::=
  9105.       [ ( <comment character> | <separator> )... ]
  9106.  
  9107.   <bracketed comment terminator> ::= <asterisk><solidus>
  9108.  
  9109.   <token> ::=
  9110.         <nondelimiter token>
  9111.       | <delimiter token>
  9112.  
  9113.   <nondelimiter token> ::=
  9114.         <regular identifier>
  9115.       | <key word>
  9116.       | <unsigned numeric literal>
  9117.       | <national character string literal>
  9118.       | <bit string literal>
  9119.       | <hex string literal>
  9120.       | <user-defined operator symbol>
  9121.  
  9122.   <regular identifier> ::= <identifier body>
  9123.  
  9124.   <identifier body> ::=
  9125.       <identifier start> [ ( <underscore> | <identifier part> )... ]
  9126.  
  9127.   <identifier start> ::= !! <EMPHASIS>(See the Syntax Rules)
  9128.  
  9129.   <identifier part> ::=
  9130.         <identifier start>
  9131.       | <digit>
  9132.  
  9133.   <key word> ::=
  9134.         <reserved word>
  9135.       | <non-reserved word>
  9136.  
  9137.   <reserved word> ::=
  9138.         ABSOLUTE | ACTION | ACTOR | ADD | AFTER | ALIAS
  9139.       | ALL | ALLOCATE | ALTER
  9140.       | AND | ANY | ARE
  9141.       | AS | ASC | ASSERTION
  9142.       | ASYNC | AT
  9143.       | ATTRIBUTES
  9144.       | AUTHORIZATION | AVG
  9145.       | BEFORE | BEGIN | BETWEEN | BIT | BIT_LENGTH
  9146.       | BOOLEAN | BOTH | BREADTH | BY
  9147.       | CASCADE | CASCADED | CASE | CAST
  9148.       | CATALOG
  9149.       | CHAR | CHARACTER
  9150.       | CHAR_LENGTH | CHARACTER_LENGTH | CHECK | CLASS | CLOSE | COALESCE
  9151.       | COLLATE
  9152.       | COLLATION | COLUMN | COMMIT | COMPLETION
  9153.       | CONNECT | CONNECTION | CONSTRAINT
  9154.       | CONSTRAINTS | CONSTRUCTOR | CONTINUE | CONVERT | CORRESPONDING
  9155.       | COUNT
  9156.       | CREATE | CROSS | CURRENT | CURRENT_DATE
  9157.       | CURRENT_PATH
  9158.       | CURRENT_TIME
  9159.       | CURRENT_TIMESTAMP | CURRENT_USER | CURSOR | CYCLE
  9160.       | DATA | DATE | DAY | DEALLOCATE
  9161.       | DEC | DECIMAL | DECLARE | DEFAULT
  9162.       | DEFERRABLE | DEFERRED | DELETE | DEPTH
  9163.       | DESC | DESCRIBE
  9164.       | DESCRIPTOR
  9165.       | DESIGNATOR
  9166.       | DESTROY | DESTRUCTOR | DICTIONARY
  9167.       | DIAGNOSTICS | DISCONNECT | DISTINCT | DOMAIN
  9168.       | DOUBLE | DROP
  9169.       | EACH
  9170.       | ELEMENT
  9171.       | ELSE
  9172.       | END | END-EXEC | EQUALS
  9173.       | ESCAPE | EXCEPT
  9174.       | EXEC | EXECUTE | EXISTS | EXTERNAL | EXTRACT
  9175.       | FACTOR
  9176.       | FALSE | FETCH | FIRST | FLOAT | FOR | FOREIGN
  9177.       | FOUND | FROM | FULL
  9178.       | FUNCTION
  9179.       | GENERAL | GET | GLOBAL | GO | GOTO
  9180.       | GRANT | GROUP
  9181.       | HAVING | HOUR
  9182.       | IDENTITY | IGNORE | IMMEDIATE
  9183.       | IN | INDICATOR
  9184.       | INITIALLY | INNER | INOUT
  9185.       | INPUT | INSENSITIVE | INSERT
  9186.       | INSTEAD
  9187.       | INT | INTEGER | INTERSECT | INTERVAL
  9188.       | INTO | IS | ISOLATION
  9189.       | JOIN
  9190.       | KEY
  9191.       | LANGUAGE | LAST | LEADING | LEFT
  9192.       | LESS | LEVEL | LIKE | LIMIT
  9193.       | LIST
  9194.       | LOCAL | LOWER
  9195.       | MATCH | MAX | MIN | MINUTE | MODIFY | MODULE
  9196.       | MONTH
  9197.       | MOVE | MULTISET
  9198.       | NAMES | NATIONAL | NATURAL | NCHAR | NEW
  9199.       | NEW_TABLE
  9200.       | NEXT | NO
  9201.       | NONE | NOT| NULL | NULLIF | NUMERIC
  9202.       | OCTET_LENGTH | OF | OFF
  9203.       | OID | OLD
  9204.       | OLD_TABLE
  9205.       | ON | ONLY | OPEN | OPERATION
  9206.       | OPERATOR
  9207.       | OPERATORS
  9208.       | OPTION | OR | ORDER
  9209.       | OUT | OUTER | OUTPUT | OVERLAPS
  9210.       | PAD | PARAMETERS | PARTIAL
  9211.       | PATH
  9212.       | PENDANT | POSITION | POSTFIX | PRECISION | PREFIX
  9213.       | PREORDER | PREPARE | PRESERVE | PRIMARY | PRIOR | PRIVATE
  9214.       | PRIVILEGES | PROCEDURE | PROTECTED | PUBLIC
  9215.       | READ | REAL | RECURSIVE
  9216.       | REFERENCES | REFERENCING | RELATIVE | REPRESENTATION
  9217.       | RESTRICT | REVOKE | RIGHT
  9218.       | ROLE | ROLLBACK
  9219.       | ROUTINE
  9220.       | ROW | ROWS
  9221.       | SAVEPOINT | SCHEMA | SCROLL | SEARCH | SECOND | SECTION
  9222.       | SELECT
  9223.       | SENSITIVE
  9224.       | SEQUENCE
  9225.       | SESSION | SESSION_USER | SET
  9226.       | SIMILAR | SIZE | SMALLINT | SOME | SPACE | SPECIFIC
  9227.       | SQL | SQLCODE
  9228.       | SQLERROR | SQLEXCEPTION | SQLSTATE | SQLWARNING
  9229.       | START | STATE
  9230.       | STRUCTURE
  9231.       | SUBSTRING | SUM
  9232.       | SYMBOL
  9233.       | SYSTEM_USER
  9234.       | TABLE | TEMPLATE | TEMPORARY
  9235.       | TERM
  9236.       | TEST | THAN
  9237.       | THEN | THERE | TIME | TIMESTAMP
  9238.       | TIMEZONE_HOUR
  9239.       | TIMEZONE_MINUTE | TO | TRAILING | TRANSACTION
  9240.       | TRANSLATE | TRANSLATION
  9241.       | TRIGGER | TRIM | TRUE | TYPE
  9242.       | UNDER | UNION | UNIQUE | UNKNOWN
  9243.       | UPDATE | UPPER | USAGE | USER | USING
  9244.       | VALUE | VALUES | VARCHAR | VARIABLE | VARIANT
  9245.       | VARYING | VIEW
  9246.       | VIRTUAL | VISIBLE
  9247.       | WAIT | WHEN | WHENEVER | WHERE
  9248.       | WITH | WITHOUT
  9249.       | WORK | WRITE
  9250.       | YEAR
  9251.       | ZONE
  9252.  
  9253.   <non-reserved word> ::=
  9254.         ADA
  9255.       | C | CATALOG_NAME
  9256.       | CHAIN
  9257.       | CHARACTER_SET_CATALOG | CHARACTER_SET_NAME
  9258.       | CHARACTER_SET_SCHEMA | CLASS_ORIGIN | COBOL | COLLATION_CATALOG
  9259.       | COLLATION_NAME
  9260.       | COLLATION_SCHEMA | COLUMN_NAME | COMMAND_FUNCTION
  9261.       | COMMITTED | CONDITION_NUMBER | CONNECTION_NAME | CONSTRAINT_CATALOG
  9262.       | CONSTRAINT_NAME | CONSTRAINT_SCHEMA | CURSOR_NAME
  9263.       | DATA | DATETIME_INTERVAL_CODE | DATETIME_INTERVAL_PRECISION
  9264.       | DYNAMIC_FUNCTION
  9265.       | FORTRAN
  9266.       | HOLD
  9267.       | KEY_MEMBER | KEY_TYPE
  9268.       | LENGTH
  9269.       | MESSAGE_LENGTH | MESSAGE_OCTET_LENGTH | MESSAGE_TEXT | MORE | MUMPS
  9270.       | NAME | NULLABLE | NUMBER
  9271.       | PASCAL | PLI
  9272.       | REPEATABLE | RETURNED_LENGTH | RETURNED_OCTET_LENGTH | RETURNED_SQLSTATE
  9273.       | ROUTINE_CATALOG | ROUTINE_NAME | ROUTINE_SCHEMA | ROW_COUNT
  9274.       | SCALE | SCHEMA_NAME | SERIALIZABLE | SERVER_NAME | SPECIFIC_NAME
  9275.       | SUBCLASS_ORIGIN
  9276.       | TABLE_NAME | TYPE
  9277.       | UNCOMMITTED | UNNAMED
  9278.  
  9279.   <unsigned numeric literal> ::=
  9280.         <exact numeric literal>
  9281.       | <approximate numeric literal>
  9282.  
  9283.   <exact numeric literal> ::=
  9284.         <unsigned integer> [ <period> [ <unsigned integer> ] ]
  9285.       | <period> <unsigned integer>
  9286.  
  9287.   <unsigned integer> ::= <digit>...
  9288.  
  9289.   <approximate numeric literal> ::= <mantissa> E <exponent>
  9290.  
  9291.   <mantissa> ::= <exact numeric literal>
  9292.  
  9293.   <exponent> ::= <signed integer>
  9294.  
  9295.   <signed integer> ::= [ <sign> ] <unsigned integer>
  9296.  
  9297.   <sign> ::= <plus sign> | <minus sign>
  9298.  
  9299.   <national character string literal> ::=
  9300.       N <quote> [ <character representation>... ] <quote>
  9301.         [ ( <separator> <quote> [ <character representation>... ] <quote> )... ]
  9302.  
  9303.   <character representation> ::=
  9304.         <nonquote character>
  9305.       | <quote symbol>
  9306.  
  9307.   <quote symbol> ::= <quote><quote>
  9308.  
  9309.   <bit string literal> ::=
  9310.       B <quote> [ <bit>... ] <quote>
  9311.         [ ( <separator> <quote> [ <bit>... ] <quote> )... ]
  9312.  
  9313.   <bit> ::= 0 | 1
  9314.  
  9315.   <hex string literal> ::=
  9316.       X <quote> [ <hexit>... ] <quote>
  9317.         [ ( <separator> <quote> [ <hexit>... ] <quote> )... ]
  9318.  
  9319.   <hexit> ::= <digit> | A | B | C | D | E | F | a | b | c | d | e | f
  9320.  
  9321.   <user-defined operator symbol> ::= !! <EMPHASIS>(See the Syntax Rules)
  9322.  
  9323.   <delimiter token> ::=
  9324.         <character string literal>
  9325.       | <date string>
  9326.       | <time string>
  9327.       | <timestamp string>
  9328.       | <interval string>
  9329.       | <delimited identifier>
  9330.       | <SQL special character>
  9331.       | <not equals operator>
  9332.       | <greater than or equals operator>
  9333.       | <less than or equals operator>
  9334.       | <concatenation operator>
  9335.       | <double period>
  9336.       | <double colon>
  9337.       | <assignment operator>
  9338.       | <left bracket>
  9339.       | <right bracket>
  9340.  
  9341.   <character string literal> ::=
  9342.       [ <introducer><character set specification> ]
  9343.       <quote> [ <character representation>... ] <quote>
  9344.         [ ( <separator> <quote> [ <character representation>... ] <quote> )... ]
  9345.  
  9346.   <introducer> ::= <underscore>
  9347.  
  9348.   <character set specification> ::=
  9349.         <standard character repertoire name>
  9350.       | <implementation-defined character repertoire name>
  9351.       | <user-defined character repertoire name>
  9352.       | <standard universal character form-of-use name>
  9353.       | <implementation-defined universal character form-of-use name>
  9354.  
  9355.   <standard character repertoire name> ::= <character set name>
  9356.  
  9357.   <character set name> ::= [ <schema name> <period> ]
  9358.         <SQL language identifier>
  9359.  
  9360.   <schema name> ::=
  9361.       [ <catalog name> <period> ] <unqualified schema name>
  9362.  
  9363.   <catalog name> ::= <identifier>
  9364.  
  9365.   <identifier> ::=
  9366.       [ <introducer><character set specification> ] <actual identifier>
  9367.  
  9368.   <actual identifier> ::=
  9369.         <regular identifier>
  9370.       | <delimited identifier>
  9371.  
  9372.   <delimited identifier> ::=
  9373.       <double quote> <delimited identifier body> <double quote>
  9374.  
  9375.   <delimited identifier body> ::= <delimited identifier part>...
  9376.  
  9377.   <delimited identifier part> ::=
  9378.         <nondoublequote character>
  9379.       | <doublequote symbol>
  9380.  
  9381.   <nondoublequote character> ::= !! <EMPHASIS>(See the Syntax Rules)
  9382.  
  9383.   <doublequote symbol> ::= <double quote><double quote>
  9384.  
  9385.   <unqualified schema name> ::= <identifier>
  9386.  
  9387.   <SQL language identifier> ::=
  9388.       <SQL language identifier start>
  9389.          [ ( <underscore> | <SQL language identifier part> )... ]
  9390.  
  9391.   <SQL language identifier start> ::= <simple Latin letter>
  9392.  
  9393.   <SQL language identifier part> ::=
  9394.         <simple Latin letter>
  9395.       | <digit>
  9396.  
  9397.   <implementation-defined character repertoire name> ::=
  9398.       <character set name>
  9399.  
  9400.   <user-defined character repertoire name> ::= <character set name>
  9401.  
  9402.   <standard universal character form-of-use name> ::=
  9403.       <character set name>
  9404.  
  9405.   <implementation-defined universal character form-of-use name> ::=
  9406.       <character set name>
  9407.  
  9408.   <date string> ::=
  9409.       <quote> <date value> <quote>
  9410.  
  9411.   <date value> ::=
  9412.       <years value> <minus sign> <months value>
  9413.           <minus sign> <days value>
  9414.  
  9415.   <years value> ::= <datetime value>
  9416.  
  9417.   <datetime value> ::= <unsigned integer>
  9418.  
  9419.   <months value> ::= <datetime value>
  9420.  
  9421.   <days value> ::= <datetime value>
  9422.  
  9423.   <time string> ::=
  9424.       <quote> <time value> [ <time zone interval> ] <quote>
  9425.  
  9426.   <time value> ::=
  9427.       <hours value> <colon> <minutes value> <colon> <seconds value>
  9428.  
  9429.   <hours value> ::= <datetime value>
  9430.  
  9431.   <minutes value> ::= <datetime value>
  9432.  
  9433.   <seconds value> ::=
  9434.         <seconds integer value> [ <period> [ <seconds fraction> ] ]
  9435.  
  9436.   <seconds integer value> ::= <unsigned integer>
  9437.  
  9438.   <seconds fraction> ::= <unsigned integer>
  9439.  
  9440.   <time zone interval> ::=
  9441.       <sign> <hours value> <colon> <minutes value>
  9442.  
  9443.   <timestamp string> ::=
  9444.       <quote> <date value> <space> <time value>
  9445.           [ <time zone interval> ] <quote>
  9446.  
  9447.   <interval string> ::=
  9448.       <quote> ( <year-month literal> | <day-time literal> ) <quote>
  9449.  
  9450.   <year-month literal> ::=
  9451.         <years value>
  9452.       | [ <years value> <minus sign> ] <months value>
  9453.  
  9454.   <day-time literal> ::=
  9455.         <day-time interval>
  9456.       | <time interval>
  9457.  
  9458.   <day-time interval> ::=
  9459.       <days value>
  9460.         [ <space> <hours value> [ <colon> <minutes value>
  9461.           [ <colon> <seconds value> ] ] ]
  9462.  
  9463.   <time interval> ::=
  9464.         <hours value> [ <colon> <minutes value> [ <colon> <seconds value> ] ]
  9465.       | <minutes value> [ <colon> <seconds value> ]
  9466.       | <seconds value>
  9467.  
  9468.   <not equals operator> ::= <>
  9469.  
  9470.   <greater than or equals operator> ::= >=
  9471.  
  9472.   <less than or equals operator> ::= <=
  9473.  
  9474.   <concatenation operator> ::= ||
  9475.  
  9476.   <double period> ::= ..
  9477.  
  9478.   <double colon> ::= ::
  9479.  
  9480.   <assignment operator> ::= :=
  9481.  
  9482.   <SQL-client module definition> ::= <module>
  9483.  
  9484.   <module> ::=
  9485.       <module name clause>
  9486.         <module remainder>
  9487.       [ END MODULE ]
  9488.  
  9489.   <module name clause> ::=
  9490.       MODULE [ <module name> ]
  9491.  
  9492.   <module name> ::=
  9493.         <SQL-server module name>
  9494.       | <SQL-client module name>
  9495.  
  9496.   <SQL-server module name> ::= <qualified identifier>
  9497.  
  9498.   <qualified identifier> ::= <identifier>
  9499.  
  9500.   <SQL-client module name> ::= <identifier>
  9501.  
  9502.   <module remainder> ::=
  9503.       [ <module character set specification> ]
  9504.       <language clause>
  9505.       <module authorization clause>
  9506.         [ <module path specification> ]
  9507.       <module contents>...
  9508.  
  9509.   <module character set specification> ::=
  9510.       NAMES ARE <character set specification>
  9511.  
  9512.   <language clause> ::=
  9513.       LANGUAGE <language name>
  9514.  
  9515.   <language name> ::=
  9516.       ADA | C | COBOL | FORTRAN | MUMPS | PASCAL | PLI | SQL
  9517.  
  9518.   <module authorization clause> ::=
  9519.         SCHEMA <schema name>
  9520.       | AUTHORIZATION <module authorization identifier>
  9521.       | SCHEMA <schema name> AUTHORIZATION <module authorization identifier>
  9522.  
  9523.   <module authorization identifier> ::=
  9524.       <authorization identifier>
  9525.  
  9526.   <authorization identifier> ::= <identifier>
  9527.  
  9528.   <module path specification> ::=
  9529.       PATH <schema name list>
  9530.  
  9531.   <schema name list> ::=
  9532.       <schema name> [ ( <comma> <schema name> )... ]
  9533.  
  9534.   <module contents> ::=
  9535.         <global declaration> [ <semicolon> ]
  9536.       | <routine>
  9537.  
  9538.   <global declaration> ::=
  9539.         <declare cursor>
  9540.       | <temporary abstract data type declaration>
  9541.       | <temporary table declaration>
  9542.       | <temporary view declaration>
  9543.  
  9544.   <declare cursor> ::=
  9545.       DECLARE <cursor name> [ <cursor sensitivity> ]
  9546.         [ SCROLL ] CURSOR
  9547.         [ WITH HOLD ]
  9548.         FOR <cursor specification>
  9549.   <cursor sensitivity> ::=
  9550.         SENSITIVE
  9551.       | INSENSITIVE
  9552.  
  9553.   <cursor name> ::= <local qualified name>
  9554.  
  9555.   <local qualified name> ::=
  9556.       [ <local qualifier> <period> ] <qualified identifier>
  9557.  
  9558.   <local qualifier> ::= MODULE
  9559.   <cursor specification> ::=
  9560.       <query expression> [ <order by clause> ]
  9561.         [ <updatability clause> ]
  9562.  
  9563.   <query expression> ::=
  9564.       <possibly updatable query expression> [ <trigger definition>... ]
  9565.  
  9566.   <possibly updatable query expression> ::=
  9567.         <non-join query expression>
  9568.       | <joined table>
  9569.  
  9570.   <non-join query expression> ::=
  9571.         <non-join query term>
  9572.       | <query expression> UNION  [ ALL ]
  9573.             [ <corresponding spec> ] <query term>
  9574.       | <query expression> EXCEPT [ ALL ]
  9575.             [ <corresponding spec> ] <query term>
  9576.  
  9577.   <non-join query term> ::=
  9578.         <non-join query primary>
  9579.       | <query term> INTERSECT [ ALL ]
  9580.             [ <corresponding spec> ] <query primary>
  9581.       | <recursive union>
  9582.  
  9583.   <non-join query primary> ::=
  9584.         <simple table>
  9585.       | <left paren> <non-join query expression> <right paren>
  9586.  
  9587.   <simple table> ::=
  9588.         <query specification>
  9589.       | <table value designator>
  9590.       | <explicit table>
  9591.       | <collection expression>
  9592.  
  9593.   <query specification> ::=
  9594.       SELECT [ <set quantifier> ] <select list>
  9595.         <table expression>
  9596.  
  9597.   <set quantifier> ::= DISTINCT | ALL
  9598.  
  9599.   <select list> ::=
  9600.         <asterisk>
  9601.       | <select sublist> [ ( <comma> <select sublist> )... ]
  9602.  
  9603.   <select sublist> ::=
  9604.         <derived column>
  9605.       | <qualifier> <period> <asterisk>
  9606.  
  9607.   <derived column> ::=
  9608.       <value expression> [ <as clause> ]
  9609.  
  9610.   <value expression> ::=
  9611.         <numeric value expression>
  9612.       | <string value expression>
  9613.       | <datetime value expression>
  9614.       | <interval value expression>
  9615.       | <enumerated value expression>
  9616.       | <boolean value expression>
  9617.       | <attributes function>
  9618.       | <abstract data type value expression>
  9619.       | <table value expression>
  9620.       | <collection value expression>
  9621.  
  9622.   <numeric value expression> ::=
  9623.         <term>
  9624.       | <numeric value expression> <plus sign> <term>
  9625.       | <numeric value expression> <minus sign> <term>
  9626.  
  9627.   <term> ::=
  9628.         <factor>
  9629.       | <term> <asterisk> <factor>
  9630.       | <term> <solidus> <factor>
  9631.  
  9632.   <factor> ::=
  9633.       [ <sign> ] <numeric primary>
  9634.  
  9635.   <numeric primary> ::=
  9636.         <value expression primary>
  9637.       | <numeric value function>
  9638.  
  9639.   <value expression primary> ::=
  9640.         <unsigned value specification>
  9641.       | <column reference>
  9642.       | <row reference>
  9643.       | <set function specification>
  9644.       | <table subquery>
  9645.       | <case expression>
  9646.       | <left paren> <value expression> <right paren>
  9647.       | <cast specification>
  9648.  
  9649.   <unsigned value specification> ::=
  9650.         <unsigned literal>
  9651.       | <general value specification>
  9652.  
  9653.   <unsigned literal> ::=
  9654.         <unsigned numeric literal>
  9655.       | <general literal>
  9656.  
  9657.   <general literal> ::=
  9658.         <character string literal>
  9659.       | <national character string literal>
  9660.       | <bit string literal>
  9661.       | <hex string literal>
  9662.       | <datetime literal>
  9663.       | <interval literal>
  9664.       | <enumeration literal>
  9665.       | <boolean literal>
  9666.       | <oid literal>
  9667.  
  9668.   <datetime literal> ::=
  9669.         <date literal>
  9670.       | <time literal>
  9671.       | <timestamp literal>
  9672.  
  9673.   <date literal> ::=
  9674.       DATE <date string>
  9675.  
  9676.   <time literal> ::=
  9677.       TIME <time string>
  9678.  
  9679.   <timestamp literal> ::=
  9680.       TIMESTAMP <timestamp string>
  9681.  
  9682.   <interval literal> ::=
  9683.       INTERVAL [ <sign> ] <interval string> <interval qualifier>
  9684.  
  9685.   <interval qualifier> ::=
  9686.         <start field> TO <end field>
  9687.       | <single datetime field>
  9688.  
  9689.   <start field> ::=
  9690.       <non-second datetime field>
  9691.           [ <left paren> <interval leading field precision> <right paren> ]
  9692.  
  9693.   <non-second datetime field> ::= YEAR | MONTH | DAY | HOUR | MINUTE
  9694.  
  9695.   <interval leading field precision> ::= <unsigned integer>
  9696.  
  9697.   <end field> ::=
  9698.         <non-second datetime field>
  9699.       | SECOND
  9700.           [ <left paren> <interval fractional seconds precision> <right paren> ]
  9701.  
  9702.   <interval fractional seconds precision> ::= <unsigned integer>
  9703.  
  9704.   <single datetime field> ::=
  9705.         <non-second datetime field>
  9706.             [ <left paren> <interval leading field precision> <right paren> ]
  9707.       | SECOND [ <left paren> <interval leading field precision>
  9708.             [ <comma> <interval fractional seconds precision> ] <right paren> ]
  9709.  
  9710.   <enumeration literal> ::=
  9711.       <domain name> <double colon> <enumeration name>
  9712.  
  9713.   <domain name> ::= <schema qualified name>
  9714.  
  9715.   <schema qualified name> ::=
  9716.       [ <schema name> <period> ] <qualified identifier>
  9717.  
  9718.   <enumeration name> ::= <identifier>
  9719.  
  9720.   <boolean literal> ::=
  9721.         TRUE
  9722.       | FALSE
  9723.  
  9724.   <oid literal> ::= OID <oid string>
  9725.  
  9726.   <oid string> ::= <quote> <oid value> <quote>
  9727.  
  9728.   <oid value> ::= <character representation>...
  9729.  
  9730.   <general value specification> ::=
  9731.         <item reference>
  9732.       | USER
  9733.       | CURRENT_USER
  9734.       | SESSION_USER
  9735.       | SYSTEM_USER
  9736.       | CURRENT_PATH
  9737.       | VALUE
  9738.       | <function invocation>
  9739.       | <attribute reference>
  9740.       | <template parameter name>
  9741.  
  9742.   <item reference> ::=
  9743.       <parameter name> [ <indicator parameter> ]
  9744.  
  9745.   <parameter name> ::= <colon> <identifier>
  9746.  
  9747.   <indicator parameter> ::= [ INDICATOR ] <parameter name>
  9748.  
  9749.   <function invocation> ::= <routine invocation>
  9750.  
  9751.   <routine invocation> ::=
  9752.       <routine name> <argument list>
  9753.  
  9754.   <routine name> ::= <local or schema qualified name>
  9755.  
  9756.   <local or schema qualified name> ::=
  9757.       [ <local or schema qualifier> <period> ] <qualified identifier>
  9758.  
  9759.   <local or schema qualifier> ::=
  9760.         <schema name>
  9761.       | MODULE
  9762.  
  9763.   <argument list> ::=
  9764.         <left paren> <positional arguments> <comma> <keyword arguments> <right paren>
  9765.       | <left paren> <positional arguments> <right paren>
  9766.       | <left paren> <keyword arguments> <right paren>
  9767.       | <left paren> <right paren>
  9768.  
  9769.   <positional arguments> ::=
  9770.       <argument> [ ( <comma> <argument> )... ]
  9771.  
  9772.   <argument> ::=
  9773.         <value expression>
  9774.       | <generalized expression>
  9775.  
  9776.   <generalized expression> ::=
  9777.       <value expression> AS <abstract data type name>
  9778.  
  9779.   <abstract data type name> ::= <local or schema qualified name>
  9780.   <attribute name> ::=
  9781.         <identifier>
  9782.       | OID
  9783.  
  9784.   <keyword arguments> ::=
  9785.       <keyword argument> [ ( <comma> <keyword argument> )... ]
  9786.  
  9787.   <keyword argument> ::=
  9788.       <parameter name> <keyword parameter tag> <argument>
  9789.  
  9790.   <keyword parameter tag> ::= =>
  9791.  
  9792.   <attribute reference> ::=
  9793.       <value specification> <period> <attribute name>
  9794.  
  9795.   <value specification> ::=
  9796.         <literal>
  9797.       | <general value specification>
  9798.  
  9799.   <literal> ::=
  9800.         <signed numeric literal>
  9801.       | <general literal>
  9802.  
  9803.   <signed numeric literal> ::=
  9804.       [ <sign> ] <unsigned numeric literal>
  9805.  
  9806.   <template parameter name> ::= <colon> <identifier>
  9807.  
  9808.   <column reference> ::= [ <qualifier> <period> ] <column name>
  9809.  
  9810.   <qualifier> ::=
  9811.         <table name>
  9812.       | <correlation name>
  9813.  
  9814.   <table name> ::=
  9815.         <local or schema qualified name>
  9816.  
  9817.   <correlation name> ::= <identifier>
  9818.  
  9819.   <column name> ::=
  9820.         <identifier>
  9821.       | OID
  9822.  
  9823.   <row reference> ::= ROW <qualifier>
  9824.  
  9825.   <set function specification> ::=
  9826.         COUNT <left paren> <asterisk> <right paren>
  9827.       | <general set function>
  9828.  
  9829.   <general set function> ::=
  9830.         <set function type>
  9831.             <left paren> [ <set quantifier> ] <value expression> <right paren> ]
  9832.  
  9833.   <set function type> ::=
  9834.       AVG | MAX | MIN | SUM | COUNT
  9835.  
  9836.   <table subquery> ::= <subquery>
  9837.  
  9838.   <subquery> ::= <left paren> <query expression> <right paren>
  9839.  
  9840.   <case expression> ::=
  9841.         <case abbreviation>
  9842.       | <case specification>
  9843.  
  9844.   <case abbreviation> ::=
  9845.         NULLIF <left paren> <value expression> <comma>
  9846.               <value expression> <right paren>
  9847.       | COALESCE <left paren> <value expression>
  9848.               ( <comma> <value expression> )... <right paren>
  9849.  
  9850.   <case specification> ::=
  9851.         <simple case>
  9852.       | <searched case>
  9853.  
  9854.   <simple case> ::=
  9855.       CASE <case operand>
  9856.         <simple when clause>...
  9857.         [ <else clause> ]
  9858.       END
  9859.  
  9860.   <case operand> ::= <value expression>
  9861.  
  9862.   <simple when clause> ::= WHEN <when operand> THEN <result>
  9863.  
  9864.   <when operand> ::= <value expression>
  9865.  
  9866.   <result> ::= <result expression> | NULL
  9867.  
  9868.   <result expression> ::= <value expression>
  9869.  
  9870.   <else clause> ::= ELSE <result>
  9871.  
  9872.   <searched case> ::=
  9873.       CASE
  9874.         <searched when clause>...
  9875.         [ <else clause> ]
  9876.       END
  9877.  
  9878.   <searched when clause> ::= WHEN <search condition> THEN <result>
  9879.  
  9880.   <search condition> ::=
  9881.       <boolean value expression>
  9882.  
  9883.   <boolean value expression> ::=
  9884.         <boolean term>
  9885.       | <boolean value expression> OR <boolean term>
  9886.  
  9887.   <boolean term> ::=
  9888.         <boolean factor>
  9889.       | <boolean term> AND <boolean factor>
  9890.  
  9891.   <boolean factor> ::=
  9892.       [ NOT ] <boolean primary>
  9893.  
  9894.   <boolean primary> ::=
  9895.         <predicate>
  9896.       | <value expression primary>
  9897.  
  9898.   <predicate> ::=
  9899.         <comparison predicate>
  9900.       | <between predicate>
  9901.       | <in predicate>
  9902.       | <like predicate>
  9903.       | <null predicate>
  9904.       | <quantified comparison predicate>
  9905.       | <exists predicate>
  9906.       | <unique predicate>
  9907.       | <match predicate>
  9908.       | <overlaps predicate>
  9909.       | <similar predicate>
  9910.       | <quantified predicate>
  9911.       | <there is predicate>
  9912.       | <distinct predicate>
  9913.       | <boolean predicate>
  9914.  
  9915.   <comparison predicate> ::=
  9916.       <row value designator> <comp op> <row value designator>
  9917.  
  9918.   <row value designator> ::=
  9919.          <row value designator element>
  9920.       | <left paren> <row value designator list> <right paren>
  9921.       | <row subquery>
  9922.  
  9923.   <row value designator element> ::=
  9924.         <value expression>
  9925.       | <null specification>
  9926.       | <default specification>
  9927.  
  9928.   <null specification> ::=
  9929.       NULL [ <left paren> <null state> <right paren> ]
  9930.  
  9931.   <null state> ::= <identifier>
  9932.  
  9933.   <default specification> ::=
  9934.       DEFAULT
  9935.  
  9936.   <row value designator list> ::=
  9937.       <row value designator element>
  9938.           [ ( <comma> <row value designator element> )... ]
  9939.  
  9940.   <row subquery> ::= <subquery>
  9941.  
  9942.   <comp op> ::=
  9943.         <equals operator>
  9944.       | <not equals operator>
  9945.       | <less than operator>
  9946.       | <greater than operator>
  9947.       | <less than or equals operator>
  9948.       | <greater than or equals operator>
  9949.  
  9950.   <between predicate> ::=
  9951.       <row value designator> [ NOT ] BETWEEN
  9952.         <row value designator> AND <row value designator>
  9953.  
  9954.   <in predicate> ::=
  9955.       <row value designator>
  9956.         [ NOT ] IN <in predicate value>
  9957.  
  9958.   <in predicate value> ::=
  9959.         <table subquery>
  9960.       | <left paren> <in value list> <right paren>
  9961.  
  9962.   <in value list> ::=
  9963.       <value expression> ( <comma> <value expression> )...
  9964.  
  9965.   <like predicate> ::=
  9966.       <match value> [ NOT ] LIKE <pattern>
  9967.         [ ESCAPE <escape character> ]
  9968.  
  9969.   <match value> ::= <character value expression>
  9970.  
  9971.   <character value expression> ::=
  9972.         <concatenation>
  9973.       | <character factor>
  9974.  
  9975.   <concatenation> ::=
  9976.       <character value expression> <concatenation operator>
  9977.           <character factor>
  9978.  
  9979.   <character factor> ::=
  9980.       <character primary> [ <collate clause> ]
  9981.  
  9982.   <character primary> ::=
  9983.         <value expression primary>
  9984.       | <string value function>
  9985.  
  9986.   <string value function> ::=
  9987.         <character value function>
  9988.       | <bit value function>
  9989.  
  9990.   <character value function> ::=
  9991.         <character substring function>
  9992.       | <regular expression substring function>
  9993.       | <fold>
  9994.       | <form-of-use conversion>
  9995.       | <character translation>
  9996.       | <trim function>
  9997.  
  9998.   <character substring function> ::=
  9999.       SUBSTRING <left paren> <character value expression> FROM <start position>
  10000.                   [ FOR <string length> ] <right paren>
  10001.  
  10002.   <start position> ::= <numeric value expression>
  10003.  
  10004.   <string length> ::= <numeric value expression>
  10005.  
  10006.   <regular expression substring function> ::=
  10007.       SUBSTRING <left paren> <character value expression> FROM
  10008.                   <character value expression> FOR
  10009.                         <escape character> <right paren>
  10010.  
  10011.   <escape character> ::= <character value expression>
  10012.  
  10013.   <fold> ::= ( UPPER | LOWER )
  10014.        <left paren> <character value expression> <right paren>
  10015.  
  10016.   <form-of-use conversion> ::=
  10017.       CONVERT <left paren> <character value expression>
  10018.           USING <form-of-use conversion name> <right paren>
  10019.  
  10020.   <form-of-use conversion name> ::= <schema qualified name>
  10021.   <character translation> ::=
  10022.       TRANSLATE <left paren> <character value expression>
  10023.           USING <translation name> <right paren>
  10024.  
  10025.   <translation name> ::= <schema qualified name>
  10026.  
  10027.   <trim function> ::=
  10028.       TRIM <left paren> <trim operands> <right paren>
  10029.  
  10030.   <trim operands> ::=
  10031.       [ [ <trim specification> ] [ <trim character> ] FROM ] <trim source>
  10032.  
  10033.   <trim specification> ::=
  10034.         LEADING
  10035.       | TRAILING
  10036.       | BOTH
  10037.  
  10038.   <trim character> ::= <character value expression>
  10039.  
  10040.   <trim source> ::= <character value expression>
  10041.  
  10042.   <bit value function> ::=
  10043.       <bit substring function>
  10044.  
  10045.   <bit substring function> ::=
  10046.       SUBSTRING <left paren> <bit value expression> FROM <start position>
  10047.           [ FOR <string length> ] <right paren>
  10048.  
  10049.   <bit value expression> ::=
  10050.         <bit concatenation>
  10051.       | <bit factor>
  10052.  
  10053.   <bit concatenation> ::=
  10054.       <bit value expression> <concatenation operator> <bit factor>
  10055.  
  10056.   <bit factor> ::= <bit primary>
  10057.  
  10058.   <bit primary> ::=
  10059.         <value expression primary>
  10060.       | <string value function>
  10061.  
  10062.   <collate clause> ::= COLLATE <collation name>
  10063.  
  10064.   <collation name> ::= <schema qualified name>
  10065.  
  10066.   <pattern> ::= <character value expression>
  10067.  
  10068.   <null predicate> ::= <row value designator>
  10069.       IS [ NOT ] NULL
  10070.           [ <left paren> <null values specification> <right paren> ]
  10071.  
  10072.   <null values specification> ::= <asterisk> | <null state>
  10073.  
  10074.   <quantified comparison predicate> ::=
  10075.       <row value designator> <comp op> <quantifier> <table subquery>
  10076.  
  10077.   <quantifier> ::= <all> | <some>
  10078.  
  10079.   <all> ::= ALL
  10080.  
  10081.   <some> ::= SOME | ANY
  10082.  
  10083.   <exists predicate> ::= EXISTS <table subquery>
  10084.  
  10085.   <unique predicate> ::= UNIQUE <table subquery>
  10086.  
  10087.   <match predicate> ::=
  10088.       <row value designator> MATCH [ UNIQUE ]
  10089.           [ PARTIAL | FULL ] <table subquery>
  10090.  
  10091.   <overlaps predicate> ::=
  10092.       <row value designator 1> OVERLAPS <row value designator 2>
  10093.  
  10094.   <row value designator 1> ::= <row value designator>
  10095.  
  10096.   <row value designator 2> ::= <row value designator>
  10097.  
  10098.   <row value designator 1> ::= <row value designator>
  10099.  
  10100.   <row value designator 2> ::= <row value designator>
  10101.  
  10102.   <similar predicate> ::=
  10103.       <match value> [ NOT ] SIMILAR TO
  10104.           <similar pattern>
  10105.         [ ESCAPE <escape character> ]
  10106.  
  10107.   <similar pattern> ::= <character value expression>
  10108.  
  10109.   <quantified predicate> ::=
  10110.         <existential clause> <left paren> <search condition> <right paren>
  10111.       | <universal clause> <left paren> <search condition> <right paren>
  10112.       | <quantified comparison predicate>
  10113.  
  10114.   <existential clause> ::=
  10115.       FOR SOME <table reference list>
  10116.  
  10117.   <table reference list> ::=
  10118.       <table reference> [ ( <comma> <table reference> )... ]
  10119.  
  10120.   <table reference> ::=
  10121.         <table name> [ [ AS ] <correlation name>
  10122.             [ <left paren> <derived column list> <right paren> ] ]
  10123.       | <derived table> [ AS ] <correlation name>
  10124.             [ <left paren> <derived column list> <right paren> ]
  10125.       | <joined table>
  10126.  
  10127.   <derived column list> ::= <column name list>
  10128.  
  10129.   <column name list> ::=
  10130.       <column name> [ ( <comma> <column name> )... ]
  10131.  
  10132.   <derived table> ::= <table subquery>
  10133.  
  10134.   <joined table> ::=
  10135.         <cross join>
  10136.       | <qualified join>
  10137.       | <left paren> <joined table> <right paren>
  10138.  
  10139.   <cross join> ::=
  10140.       <table reference> CROSS JOIN <table reference>
  10141.  
  10142.   <qualified join> ::=
  10143.       <table reference> [ NATURAL ] [ <join type> ] JOIN
  10144.         <table reference> [ <join specification> ]
  10145.  
  10146.   <join type> ::=
  10147.         INNER
  10148.       | <outer join type> [ OUTER ]
  10149.       | UNION
  10150.  
  10151.   <outer join type> ::=
  10152.         LEFT
  10153.       | RIGHT
  10154.       | FULL
  10155.  
  10156.   <join specification> ::=
  10157.         <join condition>
  10158.       | <named columns join>
  10159.       | <constraint join>
  10160.  
  10161.   <join condition> ::= ON <search condition>
  10162.  
  10163.   <named columns join> ::=
  10164.       USING <left paren> <join column list> <right paren>
  10165.  
  10166.   <join column list> ::= <column name list>
  10167.  
  10168.   <constraint join> ::=
  10169.       | USING PRIMARY KEY
  10170.       | USING FOREIGN KEY
  10171.       | USING CONSTRAINT <constraint name>
  10172.  
  10173.   <constraint name> ::= <schema qualified name>
  10174.  
  10175.   <universal clause> ::=
  10176.       FOR ALL <table reference list>
  10177.  
  10178.   <there is predicate> ::=
  10179.       <left paren> <there is clause> <where clause> <right paren>
  10180.  
  10181.   <there is clause> ::=
  10182.       THERE IS <table reference list>
  10183.  
  10184.   <where clause> ::= WHERE <search condition>
  10185.  
  10186.   <distinct predicate> ::=
  10187.       <row value designator 1> IS DISTINCT FROM
  10188.           <row value designator 2>
  10189.  
  10190.   <boolean predicate> ::=
  10191.       <boolean value expression> [ IS [ NOT ]
  10192.             <truth value> ]
  10193.  
  10194.   <truth value> ::=
  10195.         TRUE
  10196.       | FALSE
  10197.       | UNKNOWN
  10198.  
  10199.   <cast specification> ::=
  10200.       CAST <left paren> <cast operand> AS
  10201.           <cast target> <right paren>
  10202.  
  10203.   <cast operand> ::=
  10204.         <value expression>
  10205.       | NULL
  10206.  
  10207.   <cast target> ::=
  10208.         <domain name>
  10209.       | <data type>
  10210.  
  10211.   <data type> ::=
  10212.         <predefined type>
  10213.       | <abstract data type name>
  10214.       | <generated type reference>
  10215.       | <template parameter name>
  10216.       | <collection type>
  10217.  
  10218.   <predefined type> ::=
  10219.         <character string type>
  10220.              [ CHARACTER SET <character set specification> ]
  10221.       | <national character string type>
  10222.       | <bit string type>
  10223.       | <numeric type>
  10224.       | <enumerated type>
  10225.       | <boolean type>
  10226.       | <datetime type>
  10227.       | <interval type>
  10228.  
  10229.   <character string type> ::=
  10230.         CHARACTER [ <left paren> <length> <right paren> ]
  10231.       | CHAR [ <left paren> <length> <right paren> ]
  10232.       | CHARACTER VARYING <left paren> <length> <right paren>
  10233.       | CHAR VARYING <left paren> <length> <right paren>
  10234.       | VARCHAR <left paren> <length> <right paren>
  10235.  
  10236.   <length> ::= <unsigned integer>
  10237.  
  10238.   <national character string type> ::=
  10239.         NATIONAL CHARACTER [ <left paren> <length> <right paren> ]
  10240.       | NATIONAL CHAR [ <left paren> <length> <right paren> ]
  10241.       | NCHAR [ <left paren> <length> <right paren> ]
  10242.       | NATIONAL CHARACTER VARYING <left paren> <length> <right paren>
  10243.       | NATIONAL CHAR VARYING <left paren> <length> <right paren>
  10244.       | NCHAR VARYING <left paren> <length> <right paren>
  10245.  
  10246.   <bit string type> ::=
  10247.         BIT [ <left paren> <length> <right paren> ]
  10248.       | BIT VARYING <left paren> <length> <right paren>
  10249.  
  10250.   <numeric type> ::=
  10251.         <exact numeric type>
  10252.       | <approximate numeric type>
  10253.  
  10254.   <exact numeric type> ::=
  10255.         NUMERIC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  10256.       | DECIMAL [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  10257.       | DEC [ <left paren> <precision> [ <comma> <scale> ] <right paren> ]
  10258.       | INTEGER
  10259.       | INT
  10260.       | SMALLINT
  10261.  
  10262.   <precision> ::= <unsigned integer>
  10263.  
  10264.   <scale> ::= <unsigned integer>
  10265.  
  10266.   <approximate numeric type> ::=
  10267.         FLOAT [ <left paren> <precision> <right paren> ]
  10268.       | REAL
  10269.       | DOUBLE PRECISION
  10270.  
  10271.   <enumerated type> ::=
  10272.       <left paren> <enumeration name list> <right paren>
  10273.  
  10274.   <enumeration name list> ::=
  10275.       <enumeration name> [ ( <comma> <enumeration name> )... ]
  10276.  
  10277.   <boolean type> ::= BOOLEAN
  10278.  
  10279.   <datetime type> ::=
  10280.         DATE
  10281.       | TIME [ <left paren> <time precision> <right paren> ]
  10282.             [ WITH TIME ZONE ]
  10283.       | TIMESTAMP [ <left paren> <timestamp precision> <right paren> ]
  10284.             [ WITH TIME ZONE ]
  10285.   <time precision> ::= <time fractional seconds precision>
  10286.  
  10287.   <time fractional seconds precision> ::= <unsigned integer>
  10288.  
  10289.   <timestamp precision> ::= <time fractional seconds precision>
  10290.  
  10291.   <interval type> ::= INTERVAL <interval qualifier>
  10292.  
  10293.   <generated type reference> ::=
  10294.       <type template name> <template parameter list>
  10295.  
  10296.   <type template name> ::= <schema qualified name>
  10297.  
  10298.   <template parameter list> ::=
  10299.       <left paren>
  10300.         <template parameter> [ ( <comma> <template parameter> )... ]
  10301.       <right paren>
  10302.  
  10303.   <template parameter> ::=
  10304.         <value specification>
  10305.       | <data type>
  10306.  
  10307.   <collection type> ::=
  10308.         <set type>
  10309.       | <multiset type>
  10310.       | <list type>
  10311.  
  10312.   <set type> ::= SET <left paren> <data type> <right paren>
  10313.  
  10314.   <multiset type> ::= MULTISET <left paren> <data type> <right paren>
  10315.  
  10316.   <list type> ::= LIST <left paren> <data type> <right paren>
  10317.  
  10318.   <numeric value function> ::=
  10319.         <position expression>
  10320.       | <extract expression>
  10321.       | <length expression>
  10322.  
  10323.   <position expression> ::=
  10324.       POSITION <left paren> <character value expression>
  10325.           IN <character value expression> <right paren>
  10326.  
  10327.   <extract expression> ::=
  10328.       EXTRACT <left paren> <extract field>
  10329.           FROM <extract source> <right paren>
  10330.  
  10331.   <extract field> ::=
  10332.         <datetime field>
  10333.       | <time zone field>
  10334.  
  10335.   <datetime field> ::=
  10336.         <non-second datetime field>
  10337.       | SECOND
  10338.  
  10339.   <time zone field> ::=
  10340.         TIMEZONE_HOUR
  10341.       | TIMEZONE_MINUTE
  10342.  
  10343.   <extract source> ::=
  10344.         <datetime value expression>
  10345.       | <interval value expression>
  10346.  
  10347.   <datetime value expression> ::=
  10348.         <datetime term>
  10349.       | <interval value expression> <plus sign> <datetime term>
  10350.       | <datetime value expression> <plus sign> <interval term>
  10351.       | <datetime value expression> <minus sign> <interval term>
  10352.  
  10353.   <interval term> ::=
  10354.         <interval factor>
  10355.       | <interval term 2> <asterisk> <factor>
  10356.       | <interval term 2> <solidus> <factor>
  10357.       | <term> <asterisk> <interval factor>
  10358.  
  10359.   <interval factor> ::=
  10360.       [ <sign> ] <interval primary>
  10361.  
  10362.   <interval primary> ::=
  10363.         <value expression primary> [ <interval qualifier> ]
  10364.  
  10365.   <interval term 2> ::= <interval term>
  10366.  
  10367.   <interval value expression> ::=
  10368.         <interval term>
  10369.       | <interval value expression 1> <plus sign> <interval term 1>
  10370.       | <interval value expression 1> <minus sign> <interval term 1>
  10371.       | <left paren> <datetime value expression> <minus sign>
  10372.             <datetime term> <right paren> <interval qualifier>
  10373.  
  10374.   <interval value expression 1> ::= <interval value expression>
  10375.  
  10376.   <interval term 1> ::= <interval term>
  10377.  
  10378.   <datetime term> ::=
  10379.         <datetime factor>
  10380.  
  10381.   <datetime factor> ::=
  10382.         <datetime primary> [ <time zone> ]
  10383.  
  10384.   <datetime primary> ::=
  10385.         <value expression primary>
  10386.       | <datetime value function>
  10387.  
  10388.   <datetime value function> ::=
  10389.         <current date value function>
  10390.       | <current time value function>
  10391.       | <current timestamp value function>
  10392.  
  10393.   <current date value function> ::= CURRENT_DATE
  10394.  
  10395.   <current time value function> ::=
  10396.         CURRENT_TIME [ <left paren> <time precision> <right paren> ]
  10397.  
  10398.   <current timestamp value function> ::=
  10399.         CURRENT_TIMESTAMP [ <left paren> <timestamp precision> <right paren> ]
  10400.  
  10401.   <time zone> ::=
  10402.       AT <time zone specifier>
  10403.  
  10404.   <time zone specifier> ::=
  10405.         LOCAL
  10406.       | TIME ZONE <interval primary>
  10407.  
  10408.   <length expression> ::=
  10409.         <char length expression>
  10410.       | <octet length expression>
  10411.       | <bit length expression>
  10412.  
  10413.   <char length expression> ::=
  10414.       ( CHAR_LENGTH | CHARACTER_LENGTH )
  10415.           <left paren> <string value expression> <right paren>
  10416.  
  10417.   <string value expression> ::=
  10418.         <character value expression>
  10419.       | <bit value expression>
  10420.  
  10421.   <octet length expression> ::=
  10422.       OCTET_LENGTH <left paren> <string value expression> <right paren>
  10423.  
  10424.   <bit length expression> ::=
  10425.       BIT_LENGTH <left paren> <string value expression> <right paren>
  10426.  
  10427.   <enumerated value expression> ::=
  10428.         <domain name> <left paren> <value expression> <right paren>
  10429.       | <enumerated primary>
  10430.  
  10431.   <enumerated primary> ::=
  10432.         <value expression primary>
  10433.  
  10434.   <attributes function> ::=
  10435.       ATTRIBUTES
  10436.         <left paren> <abstract data type value expression> <right paren>
  10437.  
  10438.   <abstract data type value expression> ::= <ADT expression>
  10439.  
  10440.   <ADT expression> ::=
  10441.       <ADT term>
  10442.       | <ADT expression> <term operator> <ADT term>
  10443.  
  10444.   <term operator> ::= <ADT operator>
  10445.  
  10446.   <ADT operator> ::= <user-defined operator symbol)
  10447.  
  10448.   <ADT term> ::=
  10449.       <ADT factor>
  10450.       | <ADT term> <factor operator> <ADT factor>
  10451.  
  10452.   <factor operator> ::= <ADT operator>
  10453.  
  10454.   <ADT factor> ::=
  10455.       <ADT primary>
  10456.       | <prefix operator> <ADT primary>
  10457.       | <ADT primary> <postfix operator>
  10458.  
  10459.   <ADT primary> ::=
  10460.       <value expression primary>
  10461.  
  10462.   <prefix operator> ::= <ADT operator>
  10463.  
  10464.   <postfix operator> ::= <ADT operator>
  10465.  
  10466.   <table value expression> ::=
  10467.       <table type>
  10468.         <left paren>
  10469.           [ <value expression> [ ( <comma> <value expression> )... ] ]
  10470.         <right paren>
  10471.  
  10472.   <table type> ::=
  10473.         TABLE
  10474.       | SET
  10475.       | LIST
  10476.  
  10477.   <collection value expression> ::=
  10478.         <set value designator>
  10479.       | <multiset value designator>
  10480.       | <list value designator>
  10481.  
  10482.   <set value designator> ::=
  10483.       SET <left paren> [ <collection list> ] <right paren>
  10484.  
  10485.   <collection list> ::=
  10486.       <collection element> [ ( <comma> <collection element> )... ]
  10487.  
  10488.   <collection element> ::= <value expression>
  10489.  
  10490.   <multiset value designator> ::=
  10491.       MULTISET <left paren> [ <collection list> ] <right paren>
  10492.  
  10493.   <list value designator> ::=
  10494.       LIST <left paren> [ <collection list> ] <right paren>
  10495.  
  10496.   <as clause> ::= [ AS ] <column name>
  10497.  
  10498.   <table expression> ::=
  10499.       <from clause>
  10500.       [ <where clause> ]
  10501.       [ <group by clause> ]
  10502.       [ <having clause> ]
  10503.  
  10504.   <from clause> ::= FROM <table reference>
  10505.       [ ( <comma> <table reference> )... ]
  10506.  
  10507.   <group by clause> ::=
  10508.       GROUP BY <grouping column reference list>
  10509.  
  10510.   <grouping column reference list> ::=
  10511.       <grouping column reference>
  10512.           [ ( <comma> <grouping column reference> )... ]
  10513.  
  10514.   <grouping column reference> ::=
  10515.       <column reference> [ <collate clause> ]
  10516.  
  10517.   <having clause> ::= HAVING <search condition>
  10518.  
  10519.   <table value designator> ::=
  10520.       VALUES <table value designator list>
  10521.  
  10522.   <table value designator list> ::=
  10523.       <row value designator> [ ( <comma> <row value designator> )... ]
  10524.  
  10525.   <explicit table> ::= <table type> <table name>
  10526.  
  10527.   <collection expression> ::=
  10528.       <value expression>
  10529.  
  10530.   <query term> ::=
  10531.         <non-join query term>
  10532.       | <joined table>
  10533.  
  10534.   <corresponding spec> ::=
  10535.       CORRESPONDING [ BY <left paren> <corresponding column list> <right paren> ]
  10536.  
  10537.   <corresponding column list> ::= <column name list>
  10538.  
  10539.   <query primary> ::=
  10540.         <non-join query primary>
  10541.       | <joined table>
  10542.  
  10543.   <recursive union> ::=
  10544.       <left paren> <initial expression>
  10545.         RECURSIVE UNION <correlation name list>
  10546.             [ <left paren> <recursive column list> <right paren> ]
  10547.         <iteration expression>
  10548.         [ <search clause> ]
  10549.         [ <cycle clause> ]
  10550.         [ <limit clause> ] <right paren>
  10551.  
  10552.   <initial expression> ::= <query expression>
  10553.  
  10554.   <correlation name list> ::=
  10555.       <correlation name> [ ( <comma> <correlation name> )... ]
  10556.  
  10557.   <recursive column list> ::= <column name list>
  10558.  
  10559.   <iteration expression> ::= <query expression>
  10560.  
  10561.   <search clause> ::=
  10562.       SEARCH <search order> SET <sequence column>
  10563.  
  10564.   <search order> ::=
  10565.         PREORDER
  10566.       | ( DEPTH | BREADTH ) FIRST BY <sort specification list>
  10567.  
  10568.   <sort specification list> ::=
  10569.       <sort specification> [ ( <comma> <sort specification> )... ]
  10570.  
  10571.   <sort specification> ::=
  10572.       <sort key> [ <collate clause> ] [ <ordering specification> ]
  10573.  
  10574.   <sort key> ::=
  10575.       <value expression>
  10576.  
  10577.   <ordering specification> ::= ASC | DESC
  10578.  
  10579.   <sequence column> ::= <column name>
  10580.  
  10581.   <cycle clause> ::=
  10582.       CYCLE [ <cycle column list> ]
  10583.         SET <cycle mark column>
  10584.             [ TO <cycle mark value> ]
  10585.  
  10586.   <cycle column list> ::=
  10587.       <cycle column> [ ( <comma> <cycle column> )... ]
  10588.  
  10589.   <cycle column> ::= <column name>
  10590.  
  10591.   <cycle mark column> ::= <column name>
  10592.  
  10593.   <cycle mark value> ::= <value expression>
  10594.  
  10595.   <limit clause> ::=
  10596.       [ RETURN | EXCEPTION ] LIMIT
  10597.           <left paren> <value specification> <right paren>
  10598.  
  10599.   <trigger definition> ::=
  10600.       [ CREATE ] TRIGGER [ <trigger name> ]
  10601.         <trigger action time> <trigger event>
  10602.           [ ON <table name> ]
  10603.           [ ORDER <order value> ]
  10604.           [ REFERENCING <old or new values alias list> ]
  10605.         <triggered action>
  10606.  
  10607.   <trigger name> ::= <schema qualified name>
  10608.  
  10609.   <trigger action time> ::=
  10610.         BEFORE
  10611.       | AFTER
  10612.       | INSTEAD OF
  10613.  
  10614.   <trigger event> ::=
  10615.         INSERT
  10616.       | DELETE
  10617.       | UPDATE [ OF <trigger column list> ]
  10618.  
  10619.   <trigger column list> ::= <column name list>
  10620.  
  10621.   <order value> ::= <unsigned integer>
  10622.  
  10623.   <old or new values alias list> ::=
  10624.       <old or new values alias>...
  10625.  
  10626.   <old or new values alias> ::=
  10627.         OLD [ AS ]
  10628.             <old values correlation name>
  10629.       | NEW [ AS ]
  10630.             <new values correlation name>
  10631.       | OLD_TABLE [ AS ]
  10632.             <old values table alias>
  10633.       | NEW_TABLE [ AS ]
  10634.             <new values table alias>
  10635.  
  10636.   <old values correlation name> ::= <correlation name>
  10637.  
  10638.   <new values correlation name> ::= <correlation name>
  10639.  
  10640.   <old values table alias> ::= <identifier>
  10641.  
  10642.   <new values table alias> ::= <identifier>
  10643.  
  10644.   <triggered action> ::=
  10645.       [ FOR EACH ( ROW | STATEMENT ) ]
  10646.         [ WHEN <left paren> <search condition> <right paren> ]
  10647.         <triggered SQL statement>
  10648.  
  10649.   <triggered SQL statement> ::=
  10650.       <SQL procedure statement> <semicolon>
  10651.  
  10652.   <SQL procedure statement> ::=
  10653.       [ ASYNC <left paren> <async statement identifier> <right paren> ]
  10654.             <SQL executable statement>
  10655.  
  10656.   <async statement identifier> ::= <numeric value expression>
  10657.  
  10658.   <SQL executable statement> ::=
  10659.         <SQL schema statement>
  10660.       | <SQL data statement>
  10661.       | <SQL transaction statement>
  10662.       | <SQL connection statement>
  10663.       | <SQL session statement>
  10664.       | <SQL diagnostics statement>
  10665.  
  10666.   <SQL schema statement> ::=
  10667.         <SQL schema definition statement>
  10668.       | <SQL schema manipulation statement>
  10669.  
  10670.   <SQL schema definition statement> ::=
  10671.         <schema definition>
  10672.       | <table definition>
  10673.       | <view definition>
  10674.       | <grant statement>
  10675.       | <role definition>
  10676.       | <grant role statement>
  10677.       | <domain definition>
  10678.       | <null class definition>
  10679.       | <character set definition>
  10680.       | <collation definition>
  10681.       | <translation definition>
  10682.       | <assertion definition>
  10683.       | <trigger definition>
  10684.       | <routine>
  10685.       | <abstract data type definition>
  10686.       | <type template definition>
  10687.  
  10688.   <schema definition> ::=
  10689.       CREATE SCHEMA <schema name clause>
  10690.         [ <schema character set specification> ]
  10691.         [ <schema path specification> ]
  10692.         [ <schema element>... ]
  10693.  
  10694.   <schema name clause> ::=
  10695.         <schema name>
  10696.       | AUTHORIZATION <schema authorization identifier>
  10697.       | <schema name> AUTHORIZATION <schema authorization identifier>
  10698.  
  10699.   <schema authorization identifier> ::=
  10700.       <authorization identifier>
  10701.  
  10702.   <schema character set specification> ::=
  10703.       DEFAULT CHARACTER SET <character set specification>
  10704.  
  10705.   <schema path specification> ::=
  10706.       PATH <schema name list>
  10707.  
  10708.   <schema element> ::=
  10709.         <table definition>
  10710.       | <view definition>
  10711.       | <domain definition>
  10712.       | <null class definition>
  10713.       | <character set definition>
  10714.       | <collation definition>
  10715.       | <translation definition>
  10716.       | <assertion definition>
  10717.       | <trigger definition>
  10718.       | <routine>
  10719.       | <abstract data type definition>
  10720.       | <type template definition>
  10721.       | <grant statement>
  10722.       | <role definition>
  10723.       | <grant role statement>
  10724.  
  10725.   <table definition> ::=
  10726.       CREATE [ <table scope> ] <table type> <table name>
  10727.         [ <constant or updatable> ]
  10728.         ( <table element list> | <subtable clause> )
  10729.         [ ON COMMIT <table commit action> ROWS ]
  10730.  
  10731.   <table scope> ::=
  10732.       <global or local> TEMPORARY
  10733.  
  10734.   <global or local> ::=
  10735.         GLOBAL
  10736.       | LOCAL
  10737.  
  10738.   <constant or updatable> ::=
  10739.         CONSTANT
  10740.       | UPDATABLE
  10741.  
  10742.   <table element list> ::=
  10743.       <left paren> <table element> [ ( <comma> <table element> )... ] <right paren>
  10744.  
  10745.   <table element> ::=
  10746.         <column definition>
  10747.       | <table constraint definition>
  10748.       | <like clause>
  10749.  
  10750.   <column definition> ::=
  10751.       <column name>
  10752.       ( <data type> | <domain name> )
  10753.       [ <default clause> ]
  10754.       [ <column constraint definition>... ]
  10755.       [ <collate clause> ]
  10756.       [ <null clause> ]
  10757.  
  10758.   <default clause> ::=
  10759.         ( DEFAULT | <assignment operator> ) <default option>
  10760.  
  10761.   <default option> ::=
  10762.         <literal>
  10763.       | <datetime value function>
  10764.       | USER
  10765.       | CURRENT_USER
  10766.       | SESSION_USER
  10767.       | SYSTEM_USER
  10768.       | NULL [ <left paren> <null state> <right paren> ]
  10769.       | <function invocation>
  10770.  
  10771.   <column constraint definition> ::=
  10772.       [ <constraint name definition> ]
  10773.       <column constraint> [ <constraint attributes> ]
  10774.  
  10775.   <constraint name definition> ::= CONSTRAINT <constraint name>
  10776.  
  10777.   <column constraint> ::=
  10778.         NOT NULL
  10779.       | <unique specification>
  10780.       | <references specification>
  10781.       | <check constraint definition>
  10782.  
  10783.   <unique specification> ::=
  10784.         UNIQUE
  10785.       | PRIMARY KEY
  10786.  
  10787.   <references specification> ::=
  10788.       REFERENCES [ PENDANT ] <referenced table and columns>
  10789.         [ MATCH <match type> ]
  10790.         [ <referential triggered action> ]
  10791.  
  10792.   <referenced table and columns> ::=
  10793.        <table name> [ <left paren> [ <reference column list> ] <right paren> ]
  10794.  
  10795.   <reference column list> ::= <column name list>
  10796.  
  10797.   <match type> ::=
  10798.         FULL
  10799.       | PARTIAL
  10800.  
  10801.   <referential triggered action> ::=
  10802.         <update rule> [ <delete rule> ]
  10803.       | <delete rule> [ <update rule> ]
  10804.  
  10805.   <update rule> ::= ON UPDATE <referential action>
  10806.  
  10807.   <referential action> ::=
  10808.         CASCADE
  10809.       | SET NULL [ <left paren> <null state> <right paren> ]
  10810.       | SET DEFAULT
  10811.       | RESTRICT
  10812.       | NO ACTION
  10813.   <delete rule> ::= ON DELETE <referential action>
  10814.  
  10815.   <check constraint definition> ::=
  10816.       CHECK <left paren> <search condition> <right paren>
  10817.  
  10818.   <constraint attributes> ::=
  10819.         <constraint check time> [ [ NOT ] DEFERRABLE ]
  10820.       | [ NOT ] DEFERRABLE [ <constraint check time> ]
  10821.  
  10822.   <constraint check time> ::=
  10823.         INITIALLY DEFERRED
  10824.       | INITIALLY IMMEDIATE
  10825.  
  10826.   <null clause> ::=
  10827.       NULL IS <null class name>
  10828.  
  10829.   <null class name> ::= <schema qualified name>
  10830.  
  10831.   <null clause> ::=
  10832.       NULL IS <null class name>
  10833.  
  10834.   <table constraint definition> ::=
  10835.       [ <constraint name definition> ]
  10836.       <table constraint> [ <constraint attributes> ]
  10837.  
  10838.   <table constraint> ::=
  10839.         <unique constraint definition>
  10840.       | <referential constraint definition>
  10841.       | <check constraint definition>
  10842.  
  10843.   <unique constraint definition> ::=
  10844.                                   even in SQL3)
  10845.         <unique specification> [ <left paren> <unique column list>
  10846.             <right paren> ]
  10847.       | UNIQUE ( VALUE )
  10848.  
  10849.   <unique column list> ::= <column name list>
  10850.  
  10851.   <referential constraint definition> ::=
  10852.       FOREIGN KEY [ <left paren> <referencing columns> <right paren> ]
  10853.         <references specification>
  10854.  
  10855.   <referencing columns> ::=
  10856.       <reference column list>
  10857.  
  10858.   <like clause> ::= LIKE <table name>
  10859.  
  10860.   <subtable clause> ::=
  10861.       UNDER <supertable clause>
  10862.           [ ( , <supertable clause> )... ]
  10863.  
  10864.   <supertable clause> ::=
  10865.       <supertable name>
  10866.         [ WITH ( <member renaming element>
  10867.             [ ( , <member renaming element> )... ] ) ]
  10868.  
  10869.   <supertable name> ::= <table name>
  10870.  
  10871.   <member renaming element> ::=
  10872.       <supertable member name> AS <subtable member name>
  10873.  
  10874.   <supertable member name> ::=
  10875.         <column name>
  10876.       | <routine name>
  10877.  
  10878.   <subtable member name> ::=
  10879.         <column name>
  10880.       | <routine name>
  10881.  
  10882.   <table commit action> ::=
  10883.         PRESERVE
  10884.       | DELETE
  10885.  
  10886.   <view definition> ::=
  10887.       CREATE VIEW <table name> [ <left paren> <view column list> <right paren> ]
  10888.         AS <query expression>
  10889.         [ WITH [ <levels clause> ] CHECK OPTION ]
  10890.  
  10891.   <view column list> ::= <column name list>
  10892.  
  10893.   <levels clause> ::=
  10894.         CASCADED
  10895.       | LOCAL
  10896.  
  10897.   <domain definition> ::=
  10898.       CREATE DOMAIN <domain name>
  10899.           [ AS ] <data type>
  10900.         [ <default clause> ]
  10901.         [ <domain constraint>... ]
  10902.         [ <collate clause> ]
  10903.         [ <null clause> ]
  10904.  
  10905.   <domain constraint> ::=
  10906.       [ <constraint name definition> ]
  10907.       <check constraint definition> [ <constraint attributes> ]
  10908.  
  10909.   <null class definition> ::=
  10910.       CREATE NULL CLASS <null class name> [ AS ]
  10911.           ( <null state list> )
  10912.  
  10913.   <null state list> ::=
  10914.       <null state> [ ( <comma> <null state> )... ]
  10915.  
  10916.   <character set definition> ::=
  10917.       CREATE CHARACTER SET <character set name>
  10918.           [ AS ]
  10919.         <character set source>
  10920.         <form-of-use specification>
  10921.         [ <collate clause> | <limited collation definition> ]
  10922.  
  10923.   <character set source> ::=
  10924.         GET <existing character set name>
  10925.             [ <plus sign> <character set source> ]
  10926.       | <left paren> <character list> <right paren>
  10927.  
  10928.   <character list> ::=
  10929.       <character specification> [ ( <comma> <character specification> )... ]
  10930.  
  10931.   <character specification> ::=
  10932.         <character string literal>
  10933.       | <ISO 10646 position>
  10934.       | <ISO 10646 character name>
  10935.  
  10936.   <ISO 10646 position> ::=
  10937.       <val> [ <sep> <val> [ <sep> <val> [ <sep> <val> ] ] ]
  10938.  
  10939.   <val> ::= <unsigned numeric literal>
  10940.  
  10941.   <sep> ::= <ampersand>
  10942.  
  10943.   <ISO 10646 character name> ::= !! <EMPHASIS>(See the Syntax Rules)
  10944.  
  10945.   <form-of-use specification> ::= <identifier>
  10946.  
  10947.   <limited collation definition> ::=
  10948.       COLLATION FROM <collation source>
  10949.  
  10950.   <collation source> ::=
  10951.         <collating sequence definition>
  10952.       | <translation collation>
  10953.       | <collation dictionary specification>
  10954.       | <collation routine specification>
  10955.  
  10956.   <collating sequence definition> ::=
  10957.         <external collation>
  10958.       | <schema collation name>
  10959.       | <internal collation source>
  10960.       | DESC <left paren> <collation name> <right paren>
  10961.       | DEFAULT
  10962.  
  10963.   <external collation> ::=
  10964.       EXTERNAL
  10965.           <left paren> <quote> <external collation name> <quote> <right paren>
  10966.  
  10967.   <external collation name> ::=
  10968.         <standard collation name>
  10969.       | <implementation-defined collation name>
  10970.  
  10971.   <standard collation name> ::= <collation name>
  10972.  
  10973.   <implementation-defined collation name> ::= <collation name>
  10974.  
  10975.   <schema collation name> ::= <collation name>
  10976.  
  10977.   <internal collation source> ::= <left paren> <collation options> <right paren>
  10978.  
  10979.   <collation options> ::=
  10980.       <collation option> [ ( <comma> <collation option> )... ]
  10981.  
  10982.   <collation option> ::=
  10983.         USING <left paren> <collating basis> <right paren>
  10984.       | SEQUENCE <left paren> <enumerated collating sequence> <right paren>
  10985.       | MODIFY <left paren> <collating modifiers> <right paren>
  10986.       | WHEN NOT FOUND
  10987.           ( IGNORE | MAX | MIN )
  10988.  
  10989.   <collating basis> ::=
  10990.       <collating foundation> [ ( <plus sign> <collating foundation> )... ]
  10991.  
  10992.   <collating foundation> ::=
  10993.       <collating sequence definition>
  10994.       <collating sequence definition> [ ( <asterisk> <translation name> )... ]
  10995.  
  10996.   <enumerated collating sequence> ::=
  10997.       <collating chars> [ ( <comma> <collating chars> )... ]
  10998.  
  10999.   <collating chars> ::=
  11000.         <character specification>
  11001.       | <character range>
  11002.  
  11003.   <character range> ::=
  11004.       <character specification> <minus sign> <character specification>
  11005.  
  11006.   <collating modifiers> ::=
  11007.         <collating modifier> [ ( <comma> <collating modifier> )... ]
  11008.  
  11009.   <collating modifier> ::=
  11010.       <collating chars>
  11011.         ( <less than operator> | <greater than operator> | <equals operator> )
  11012.       <collating chars>
  11013.  
  11014.   <translation collation> ::=
  11015.       TRANSLATION <translation name>
  11016.           [ THEN COLLATION <collation name> ]
  11017.  
  11018.   <collation dictionary specification> ::=
  11019.       DICTIONARY <dictionary name> [ <plus sign> <dictionary name> ]
  11020.  
  11021.   <dictionary name> ::=
  11022.       <quote> <implementation-defined dictionary name> <quote>
  11023.  
  11024.   <implementation-defined dictionary name> ::= !! <EMPHASIS>(See the Syntax Rules)
  11025.  
  11026.   <collation routine specification> ::=
  11027.         ROUTINE <left paren> <implementation-defined routine name>
  11028.             <left paren> <params> <right paren> <right paren>
  11029.  
  11030.   <implementation-defined routine name> ::= !! <EMPHASIS>(See the Syntax Rules)
  11031.  
  11032.   <params> ::= !! <EMPHASIS>(Not yet defined)
  11033.  
  11034.   <params> ::= !! <EMPHASIS>(Not yet defined)
  11035.  
  11036.   <existing character set name> ::=
  11037.         <standard character repertoire name>
  11038.       | <implementation-defined character repertoire name>
  11039.       | <schema character set name>
  11040.  
  11041.   <schema character set name> ::= <character set name>
  11042.  
  11043.   <collation definition> ::=
  11044.       CREATE COLLATION <collation name> FOR
  11045.           <character set specification>
  11046.         FROM <collation source>
  11047.           [ <pad attribute> ]
  11048.  
  11049.   <pad attribute> ::=
  11050.         NO PAD
  11051.       | PAD SPACE
  11052.  
  11053.   <translation definition> ::=
  11054.       CREATE TRANSLATION <translation name>
  11055.         FOR <source character set specification>
  11056.           TO <target character set specification>
  11057.         FROM <translation source>
  11058.  
  11059.   <source character set specification> ::= <character set specification>
  11060.  
  11061.   <target character set specification> ::= <character set specification>
  11062.  
  11063.   <translation source> ::=
  11064.         <translation specification>
  11065.       | <translation routine>
  11066.  
  11067.   <translation specification> ::=
  11068.         <external translation>
  11069.       | IDENTITY
  11070.       | <schema translation name>
  11071.       | <internal translation source>
  11072.  
  11073.   <external translation> ::=
  11074.       EXTERNAL
  11075.           <left paren> <quote> <external translation name> <quote> <right paren>
  11076.  
  11077.   <external translation name> ::=
  11078.         <standard translation name>
  11079.       | <implementation-defined translation name>
  11080.  
  11081.   <standard translation name> ::= <translation name>
  11082.  
  11083.   <implementation-defined translation name> ::= <translation name>
  11084.  
  11085.   <schema translation name> ::= <translation name>
  11086.  
  11087.   <internal translation source> ::=
  11088.       <left paren> <translation options> <right paren>
  11089.  
  11090.   <translation options> ::=
  11091.       <translation option> [ ( <comma> <translation option> )... ]
  11092.  
  11093.   <translation option> ::=
  11094.         USING <left paren> <translation basis> <right paren>
  11095.       | MODIFY <left paren> <translation modifiers> <right paren>
  11096.  
  11097.   <translation basis> ::=
  11098.       <translation definition> [ ( <asterisk> <translation definition> )... ]
  11099.  
  11100.   <translation modifiers> ::=
  11101.         <translation modifier> [ ( <comma> <translation modifier> )... ]
  11102.  
  11103.   <translation modifier> ::=
  11104.       <collating chars> <equals operator> <collating chars>
  11105.  
  11106.   <translation routine> ::=
  11107.         ROUTINE <left paren> <implementation-defined routine name>
  11108.             <left paren> <params> <right paren> <right paren>
  11109.  
  11110.   <assertion definition> ::=
  11111.       CREATE ASSERTION <constraint name>
  11112.         <assertion trigger>...
  11113.         <triggered assertion> [ <constraint attributes> ]
  11114.  
  11115.   <assertion trigger> ::=
  11116.         <immediate assertion trigger>
  11117.       | <deferred assertion trigger>
  11118.  
  11119.   <immediate assertion trigger> ::=
  11120.       AFTER ( <assertion trigger statement>
  11121.         [ ( <comma> <assertion trigger statement> )... ] ON
  11122.              <table name> )...
  11123.  
  11124.   <assertion trigger statement> ::=
  11125.         INSERT
  11126.       | DELETE
  11127.       | UPDATE [ OF <left paren> <assertion column list> <right paren> ]
  11128.  
  11129.   <assertion column list> ::= <column name list>
  11130.  
  11131.   <deferred assertion trigger> ::= BEFORE COMMIT
  11132.  
  11133.   <triggered assertion> ::=
  11134.       CHECK <left paren> <search condition> <right paren>
  11135.         [ FOR
  11136.             [ EACH [ ROW OF ] ] <table name> ]
  11137.  
  11138.   <routine> ::=
  11139.       [ CREATE | DECLARE ] <routine header> <routine name> <parameter list>
  11140.       [ <returns clause> ]
  11141.       [ <caller language clause> ]
  11142.       [ SPECIFIC <specific name> ] <semicolon>
  11143.       <routine body> <semicolon>
  11144.  
  11145.   <routine header> ::=
  11146.         PROCEDURE
  11147.       | [ <function type> ] FUNCTION
  11148.  
  11149.   <function type> ::=
  11150.         CONSTRUCTOR
  11151.       | DESTRUCTOR
  11152.       | DESIGNATOR
  11153.       | ACTOR
  11154.  
  11155.   <parameter list> ::=
  11156.       <left paren>
  11157.         [ <parameter declaration> [ (  <comma> <parameter declaration> )... ] ]
  11158.       <right paren>
  11159.  
  11160.   <parameter declaration> ::=
  11161.         [ <parameter mode> ] [ <parameter name> ] <data type>
  11162.             [ <default clause> ]
  11163.       | <status parameter>
  11164.  
  11165.   <parameter mode> ::=
  11166.         IN
  11167.       | OUT
  11168.       | INOUT
  11169.  
  11170.   <status parameter> ::=
  11171.         SQLSTATE
  11172.       | SQLCODE
  11173.  
  11174.   <returns clause> ::= RETURNS <returns data type> [ <result cast> ]
  11175.  
  11176.   <returns data type> ::= <data type>
  11177.  
  11178.   <result cast> ::= CAST FROM <data type>
  11179.  
  11180.   <caller language clause> ::= <language clause>
  11181.  
  11182.   <specific name> ::= <schema qualified name>
  11183.  
  11184.   <routine body> ::=
  11185.         <SQL routine body>
  11186.       | <external body reference>
  11187.  
  11188.   <SQL routine body> ::= <SQL procedure statement>
  11189.  
  11190.   <external body reference> ::=
  11191.       EXTERNAL [ NAME <external routine name> ]
  11192.       <external routine language clause>
  11193.       [ <variant attribute> ]
  11194.  
  11195.   <external routine name> ::= <identifier>
  11196.  
  11197.   <external routine language clause> ::= <language clause>
  11198.  
  11199.   <variant attribute> ::=
  11200.         VARIANT
  11201.       | NOT VARIANT
  11202.  
  11203.   <abstract data type definition> ::=
  11204.         <distinct type definition>
  11205.       | <explicit abstract data type definition>
  11206.  
  11207.   <distinct type definition> ::=
  11208.       CREATE DISTINCT TYPE <distinct type name>
  11209.         AS <data type>
  11210.  
  11211.   <distinct type name> ::= <abstract data type name>
  11212.  
  11213.   <explicit abstract data type definition> ::=
  11214.       CREATE TYPE <abstract data type name>
  11215.         <abstract data type body>
  11216.  
  11217.   <abstract data type body> ::=
  11218.       [ <oid options> ]
  11219.       [ <subtype clause> ]
  11220.       [ [ <constant or updatable> ] [ <member list> ] ]
  11221.  
  11222.   <oid options> ::=
  11223.         WITH OID [ [ NOT ] VISIBLE ]
  11224.       | WITHOUT OID
  11225.  
  11226.   <subtype clause> ::=
  11227.       UNDER <supertype clause>
  11228.           [ ( <comma> <supertype clause> )... ]
  11229.  
  11230.   <supertype clause> ::=
  11231.       <abstract data type name> [ <component renaming clause> ]
  11232.  
  11233.   <component renaming clause> ::=
  11234.       WITH <left paren> <component renaming element>
  11235.           [ ( , <component renaming element> )... ] <right paren>
  11236.  
  11237.   <component renaming element> ::=
  11238.       <supertype component name> AS <subtype component name>
  11239.  
  11240.   <supertype component name> ::= <component name>
  11241.  
  11242.   <component name> ::= <identifier>
  11243.  
  11244.   <subtype component name> ::= <component name>
  11245.  
  11246.   <member list> ::=
  11247.       <left paren> <member> [ ( <comma> <member> )... ] <right paren>
  11248.  
  11249.   <member> ::=
  11250.         <attribute definition>
  11251.       | <routine declaration>
  11252.       | <operator name list>
  11253.       | <equals clause>
  11254.       | <less-than clause>
  11255.       | <cast clause>
  11256.       | <table constraint definition>
  11257.  
  11258.   <attribute definition> ::=
  11259.         <stored attribute>
  11260.       | <virtual attribute>
  11261.  
  11262.   <stored attribute> ::=
  11263.       [ <encapsulation level> ]
  11264.       <attribute name> [ <constant or updatable> ]
  11265.       ( <data type> | <domain name> )
  11266.       [ <default clause> ]
  11267.       [ <column constraint definition>... ]
  11268.       [ <collate clause> ]
  11269.       [ <null clause> ]
  11270.  
  11271.   <encapsulation level> ::=
  11272.         PRIVATE
  11273.       | PROTECTED
  11274.       | PUBLIC
  11275.   <virtual attribute> ::=
  11276.       [ <encapsulation level> ]
  11277.         <attribute name> <derivation clause>
  11278.       [ <check constraint definition>... ]
  11279.       [ <collate clause> ]
  11280.  
  11281.   <derivation clause> ::=
  11282.       [ READ ONLY | CONSTANT | UPDATABLE ] <data type>
  11283.         VIRTUAL [ <derivation functions> ]
  11284.  
  11285.   <derivation functions> ::=
  11286.         <get function> [ <set function> ]
  11287.       | <set function> [ <get function> ]
  11288.  
  11289.   <get function> ::=
  11290.       GET WITH <routine name>
  11291.  
  11292.   <set function> ::=
  11293.       SET WITH <routine name>
  11294.  
  11295.   <routine declaration> ::=
  11296.       [ <encapsulation level> ] <routine>
  11297.  
  11298.   <operator name list> ::=
  11299.       OPERATORS <specific routine designator>...
  11300.  
  11301.   <specific routine designator> ::=
  11302.         SPECIFIC <specific name>
  11303.       | <member name>
  11304.  
  11305.   <member name> ::= <routine name> [ <data type list> ]
  11306.  
  11307.   <data type list> ::=
  11308.       <left paren> <data type> [ ( <comma> <data type> )... ] <right paren>
  11309.  
  11310.   <equals clause> ::=
  11311.       EQUALS <equals function specification> <semicolon>
  11312.  
  11313.   <equals function specification> ::=
  11314.         <routine name>
  11315.       | STATE
  11316.       | OID
  11317.  
  11318.   <less-than clause> ::=
  11319.       LESS THAN <less-than function specification> <semicolon>
  11320.  
  11321.   <less-than function specification> ::=
  11322.         <routine name>
  11323.       | NONE
  11324.  
  11325.   <cast clause> ::=
  11326.       CAST <left paren> <operand data type> AS
  11327.           <result data type>
  11328.            WITH <cast function> <right paren> <semicolon>
  11329.  
  11330.   <operand data type> ::= <data type>
  11331.  
  11332.   <result data type> ::= <data type>
  11333.  
  11334.   <cast function> ::=
  11335.       <routine name>
  11336.  
  11337.   <type template definition> ::=
  11338.       CREATE TYPE TEMPLATE <type template name>
  11339.         <template parameter declaration list>
  11340.         <abstract data type body>
  11341.   <template parameter declaration list> ::=
  11342.       <left paren>
  11343.         <template parameter declaration>
  11344.           [ ( <comma> <template parameter declaration>)... ]
  11345.       <right paren>
  11346.  
  11347.   <template parameter declaration> ::=
  11348.       <template parameter name> <template parameter type>
  11349.  
  11350.   <template parameter type> ::=
  11351.         <data type>
  11352.       | TYPE
  11353.  
  11354.   <grant statement> ::=
  11355.       GRANT <privileges>
  11356.         TO <grantee> [ ( <comma> <grantee> )... ]
  11357.           [ WITH GRANT OPTION ]
  11358.  
  11359.   <privileges> ::=
  11360.         ALL SCHEMA PRIVILEGES
  11361.       | <object privileges> ON <object name>
  11362.  
  11363.   <object privileges> ::=
  11364.         ALL PRIVILEGES
  11365.       | <action> [ ( <comma> <action> )... ]
  11366.  
  11367.   <action> ::=
  11368.         SELECT [ <left paren> <privilege column list> <right paren> ]
  11369.       | DELETE
  11370.       | INSERT [ <left paren> <privilege column list> <right paren> ]
  11371.       | UPDATE [ <left paren> <privilege column list> <right paren> ]
  11372.       | REFERENCES [ <left paren> <privilege column list> <right paren> ]
  11373.       | USAGE
  11374.       | TRIGGER
  11375.       | EXECUTE
  11376.       | UNDER
  11377.  
  11378.   <privilege column list> ::= <column name list>
  11379.  
  11380.   <object name> ::=
  11381.         [ <table type> ] <table name>
  11382.       | DOMAIN <domain name>
  11383.       | COLLATION <collation name>
  11384.       | CHARACTER SET <character set name>
  11385.       | TRANSLATION <translation name>
  11386.       | NULL CLASS <null class name>
  11387.       | DATA TYPE <abstract data type name>
  11388.       | MODULE <module name>
  11389.       | TYPE TEMPLATE <type template name>
  11390.       | EXTERNAL ROUTINE <specific routine designator>
  11391.  
  11392.   <grantee> ::=
  11393.         PUBLIC
  11394.       | <authorization identifier>
  11395.       | <role name>
  11396.  
  11397.   <role name> ::= <authorization identifier>
  11398.  
  11399.   <role definition> ::= CREATE ROLE <role name>
  11400.  
  11401.   <grant role statement> ::=
  11402.       GRANT <role granted> [ ( <comma> <role granted> )... ]
  11403.         TO <grantee> [ ( <comma> <grantee> )... ]
  11404.           [ WITH ADMIN OPTION ]
  11405.  
  11406.   <role granted> ::= <role name>
  11407.   <SQL schema manipulation statement> ::=
  11408.         <drop schema statement>
  11409.       | <alter table statement>
  11410.       | <drop table statement>
  11411.       | <drop view statement>
  11412.       | <revoke statement>
  11413.       | <revoke role statement>
  11414.       | <drop role statement>
  11415.       | <alter domain statement>
  11416.       | <drop domain statement>
  11417.       | <drop null class statement>
  11418.       | <drop character set statement>
  11419.       | <drop collation statement>
  11420.       | <drop translation statement>
  11421.       | <drop assertion statement>
  11422.       | <drop trigger statement>
  11423.       | <drop routine statement>
  11424.       | <drop data type statement>
  11425.       | <drop type template statement>
  11426.  
  11427.   <drop schema statement> ::=
  11428.       DROP SCHEMA <schema name> <drop behavior>
  11429.  
  11430.   <drop behavior> ::= CASCADE | RESTRICT
  11431.  
  11432.   <alter table statement> ::=
  11433.       ALTER <table type> <table name> <alter table action>
  11434.  
  11435.   <alter table action> ::=
  11436.         <add column definition>
  11437.       | <alter column definition>
  11438.       | <drop column definition>
  11439.       | <add supertable clause>
  11440.       | <drop supertable clause>
  11441.       | <add table constraint definition>
  11442.       | <drop table constraint definition>
  11443.  
  11444.   <add column definition> ::=
  11445.       ADD [ COLUMN ] <column definition>
  11446.  
  11447.   <alter column definition> ::=
  11448.       ALTER [ COLUMN ] <column name> <alter column action>
  11449.  
  11450.   <alter column action> ::=
  11451.         <set column default clause>
  11452.       | <drop column default clause>
  11453.       | <drop column domain clause>
  11454.  
  11455.   <set column default clause> ::=
  11456.       SET <default clause>
  11457.  
  11458.   <drop column default clause> ::=
  11459.       DROP DEFAULT
  11460.  
  11461.   <drop column domain clause> ::=
  11462.       DROP DOMAIN [ <constraint disposition> [ <constraint name list> ] ]
  11463.  
  11464.   <constraint disposition> ::=
  11465.         KEEP COLUMN CONSTRAINT
  11466.       | DROP COLUMN CONSTRAINT
  11467.  
  11468.   <constraint name list> ::=
  11469.         ALL
  11470.       | <constraint name> [ ( <comma> <constraint name> )... ]
  11471.  
  11472.   <drop column definition> ::=
  11473.       DROP [ COLUMN ] <column name> <drop behavior>
  11474.  
  11475.   <add supertable clause> ::=
  11476.       ADD <supertable clause>
  11477.  
  11478.   <drop supertable clause> ::=
  11479.       DROP <supertable clause> <drop behavior>
  11480.  
  11481.   <add table constraint definition> ::=
  11482.       ADD <table constraint definition>
  11483.  
  11484.   <drop table constraint definition> ::=
  11485.       DROP CONSTRAINT <constraint name> <drop behavior>
  11486.  
  11487.   <drop table statement> ::=
  11488.       DROP <table type> <table name> <drop behavior>
  11489.  
  11490.   <drop view statement> ::=
  11491.       DROP VIEW <table name> <drop behavior>
  11492.  
  11493.   <revoke statement> ::=
  11494.       REVOKE [ GRANT OPTION FOR ]
  11495.           <privileges>
  11496.         FROM <grantee> [ ( <comma> <grantee> )... ] <drop behavior>
  11497.  
  11498.   <revoke role statement> ::=
  11499.       REVOKE <role revoked> [ ( <comma> <role revoked> )... ]
  11500.         FROM <grantee> [ ( <comma> <grantee> )... ]
  11501.  
  11502.   <role revoked> ::= <role name>
  11503.  
  11504.   <drop role statement> ::= DROP ROLE <role name>
  11505.  
  11506.   <alter domain statement> ::=
  11507.       ALTER DOMAIN <domain name> <alter domain action>
  11508.  
  11509.   <alter domain action> ::=
  11510.         <set domain default clause>
  11511.       | <drop domain default clause>
  11512.       | <add domain constraint definition>
  11513.       | <drop domain constraint definition>
  11514.  
  11515.   <set domain default clause> ::= SET <default clause>
  11516.  
  11517.   <drop domain default clause> ::= DROP DEFAULT
  11518.  
  11519.   <add domain constraint definition> ::=
  11520.       ADD <domain constraint>
  11521.  
  11522.   <drop domain constraint definition> ::=
  11523.       DROP CONSTRAINT <constraint name>
  11524.         [ <constraint disposition> ]
  11525.  
  11526.   <drop domain statement> ::=
  11527.       DROP DOMAIN <domain name> <drop behavior>
  11528.         [ <constraint disposition> [ <constraint name list> ] ]
  11529.  
  11530.   <drop null class statement> ::=
  11531.        DROP NULL CLASS <null class name>
  11532.  
  11533.   <drop character set statement> ::=
  11534.       DROP CHARACTER SET <character set name>
  11535.  
  11536.   <drop collation statement> ::=
  11537.       DROP COLLATION <collation name>
  11538.         <drop behavior>
  11539.   <drop translation statement> ::=
  11540.       DROP TRANSLATION <translation name>
  11541.  
  11542.   <drop assertion statement> ::=
  11543.       DROP ASSERTION <constraint name>
  11544.  
  11545.   <drop trigger statement> ::= DROP TRIGGER <trigger name>
  11546.  
  11547.   <drop routine statement> ::=
  11548.       DROP ( PROCEDURE | FUNCTION ) <specific routine designator> <drop behavior>
  11549.  
  11550.   <drop data type statement> ::=
  11551.       DROP DATA TYPE
  11552.           <abstract data type name> <drop behavior>
  11553.  
  11554.   <drop type template statement> ::=
  11555.       DROP TYPE TEMPLATE <type template name>
  11556.         <drop behavior>
  11557.  
  11558.   <SQL data statement> ::=
  11559.         <open statement>
  11560.       | <fetch statement>
  11561.       | <close statement>
  11562.       | <select statement: single row>
  11563.       | <new statement>
  11564.       | <destroy statement>
  11565.       | <SQL data change statement>
  11566.  
  11567.   <open statement> ::=
  11568.       OPEN <cursor name>
  11569.         [ <open cascade option> ]
  11570.  
  11571.   <open cascade option> ::=
  11572.         CASCADE ON
  11573.       | CASCADE OFF
  11574.  
  11575.   <fetch statement> ::=
  11576.       FETCH [ [ <fetch orientation> ] FROM ]
  11577.         <cursor name> INTO <fetch target list>
  11578.  
  11579.   <fetch orientation> ::=
  11580.         NEXT
  11581.       | PRIOR
  11582.       | FIRST
  11583.       | LAST
  11584.       | ( ABSOLUTE | RELATIVE ) <simple value specification>
  11585.  
  11586.   <simple value specification> ::=
  11587.         <item reference>
  11588.       | <literal>
  11589.  
  11590.   <fetch target list> ::=
  11591.       <target specification> [ ( <comma> <target specification> )... ]
  11592.  
  11593.   <target specification> ::=
  11594.         <item reference>
  11595.       | <template parameter name>
  11596.  
  11597.   <close statement> ::=
  11598.       CLOSE <cursor name>
  11599.  
  11600.   <select statement: single row> ::=
  11601.       SELECT [ <set quantifier> ] <select list>
  11602.         INTO <select target list>
  11603.           <table expression>
  11604.  
  11605.   <select target list> ::=
  11606.       <target specification> [ ( <comma> <target specification> )... ]
  11607.  
  11608.   <new statement> ::=
  11609.       NEW <item reference>
  11610.  
  11611.   <destroy statement> ::=
  11612.       DESTROY <object parameter name>
  11613.  
  11614.   <object parameter name> ::= <parameter name>
  11615.  
  11616.   <SQL data change statement> ::=
  11617.         <delete statement: positioned>
  11618.       | <delete statement: searched>
  11619.       | <insert statement>
  11620.       | <update statement: positioned>
  11621.       | <update statement: searched>
  11622.  
  11623.   <delete statement: positioned> ::=
  11624.       DELETE [ FROM <table name> ]
  11625.         WHERE CURRENT OF <cursor name>
  11626.  
  11627.   <delete statement: searched> ::=
  11628.       DELETE FROM <table reference>
  11629.         [ WHERE <search condition> ]
  11630.  
  11631.   <insert statement> ::=
  11632.       INSERT INTO ( <table reference> | CURSOR <cursor name> )
  11633.         <insert columns and source>
  11634.         [ <insert point> ]
  11635.  
  11636.   <insert columns and source> ::=
  11637.         [ <left paren> <insert column list> <right paren> ]
  11638.               <query expression>
  11639.       | DEFAULT VALUES
  11640.  
  11641.   <insert column list> ::= <column name list>
  11642.  
  11643.   <insert point> ::=
  11644.       <relative insert point> ELEMENT <where clause>
  11645.  
  11646.   <relative insert point> ::=
  11647.         BEFORE
  11648.       | AFTER
  11649.  
  11650.   <update statement: positioned> ::=
  11651.       UPDATE [ <table reference> ]
  11652.         SET [ <update type> ] <set clause list>
  11653.           WHERE CURRENT OF <cursor name>
  11654.  
  11655.   <update type> ::= ALL | SOME | NONE
  11656.  
  11657.   <set clause list> ::=
  11658.       <set clause> [ ( <comma> <set clause> )... ]
  11659.  
  11660.   <set clause> ::=
  11661.       <update target> <equals operator> <row value designator>
  11662.  
  11663.   <update target> ::=
  11664.         <object column>
  11665.       | <left paren> <object column list> <right paren>
  11666.  
  11667.   <object column> ::= <column name>
  11668.  
  11669.   <object column list> ::=
  11670.       <object column> [ ( <comma> <object column> )... ]
  11671.   <update statement: searched> ::=
  11672.       UPDATE <table reference>
  11673.         <update mechanism>
  11674.         [ WHERE <search condition> ]
  11675.  
  11676.   <update mechanism> ::=
  11677.         <update by setting>
  11678.       | <update by moving>
  11679.  
  11680.   <update by setting> ::=
  11681.       SET [ <update type> ] <set clause list>
  11682.  
  11683.   <update by moving> ::=
  11684.       MOVE <insert point>
  11685.  
  11686.   <SQL transaction statement> ::=
  11687.         <start transaction statement>
  11688.       | <set transaction statement>
  11689.       | <set constraints mode statement>
  11690.       | <test completion statement>
  11691.       | <savepoint statement>
  11692.       | <release savepoint statement>
  11693.       | <commit statement>
  11694.       | <rollback statement>
  11695.  
  11696.   <start transaction statement> ::=
  11697.       START TRANSACTION <transaction mode>
  11698.           [ ( <comma> <transaction mode> )...]
  11699.  
  11700.   <transaction mode> ::=
  11701.         <isolation level>
  11702.       | <transaction access mode>
  11703.       | <diagnostics size>
  11704.  
  11705.   <isolation level> ::=
  11706.       ISOLATION LEVEL <level of isolation>
  11707.  
  11708.   <level of isolation> ::=
  11709.         READ UNCOMMITTED
  11710.       | READ COMMITTED
  11711.       | REPEATABLE READ
  11712.       | SERIALIZABLE
  11713.  
  11714.   <transaction access mode> ::=
  11715.         READ ONLY
  11716.       | READ WRITE
  11717.  
  11718.   <diagnostics size> ::=
  11719.       DIAGNOSTICS SIZE <number of conditions>
  11720.  
  11721.   <number of conditions> ::= <simple value specification>
  11722.  
  11723.   <set transaction statement> ::=
  11724.       SET [ LOCAL ] TRANSACTION <transaction mode>
  11725.           [ ( <comma> <transaction mode> )... ]
  11726.  
  11727.   <set constraints mode statement> ::=
  11728.       SET CONSTRAINTS <constraint name list>
  11729.           ( DEFERRED | IMMEDIATE )
  11730.  
  11731.   <test completion statement> ::=
  11732.       ( TEST | WAIT )
  11733.          ( ALL | ANY | <async statement identifier list> )
  11734.       COMPLETION
  11735.  
  11736.   <async statement identifier list> ::=
  11737.       <left paren> <async statement identifier>
  11738.           [ ( <comma> <async statement identifier> )... ] <right paren>
  11739.  
  11740.   <savepoint statement> ::= SAVEPOINT <savepoint specifier>
  11741.  
  11742.   <savepoint specifier> ::=
  11743.         <savepoint name>
  11744.       | <simple target specification>
  11745.  
  11746.   <savepoint name> ::= <identifier>
  11747.  
  11748.   <simple target specification> ::=
  11749.       <item reference>
  11750.  
  11751.   <release savepoint statement> ::=
  11752.       RELEASE SAVEPOINT <savepoint specifier>
  11753.  
  11754.   <commit statement> ::=
  11755.       COMMIT [ WORK ] [ AND [ NO ] CHAIN ]
  11756.  
  11757.   <rollback statement> ::=
  11758.       ROLLBACK [ WORK ] [ AND[ NO ]  CHAIN ]
  11759.         [ <savepoint clause> ]
  11760.  
  11761.   <savepoint clause> ::=
  11762.       TO SAVEPOINT <savepoint specifier>
  11763.  
  11764.   <SQL connection statement> ::=
  11765.         <connect statement>
  11766.       | <set connection statement>
  11767.       | <disconnect statement>
  11768.  
  11769.   <connect statement> ::=
  11770.       CONNECT TO <connection target>
  11771.  
  11772.   <connection target> ::=
  11773.         <SQL-server name>
  11774.           [ AS <connection name> ]
  11775.             correspondence with Tony Gordon)
  11776.           [ USER <user name> ]
  11777.       | DEFAULT
  11778.  
  11779.   <SQL-server name> ::= <simple value specification>
  11780.  
  11781.   <connection name> ::= <simple value specification>
  11782.  
  11783.   <user name> ::= <simple value specification>
  11784.  
  11785.   <set connection statement> ::=
  11786.       SET CONNECTION <connection object>
  11787.  
  11788.   <connection object> ::=
  11789.         DEFAULT
  11790.       | <connection name>
  11791.  
  11792.   <disconnect statement> ::=
  11793.       DISCONNECT <disconnect object>
  11794.  
  11795.   <disconnect object> ::=
  11796.         <connection object>
  11797.       | ALL
  11798.       | CURRENT
  11799.  
  11800.   <SQL session statement> ::=
  11801.         <set session authorization identifier statement>
  11802.       | <set role statement>
  11803.       | <set local time zone statement>
  11804.  
  11805.   <set session authorization identifier statement> ::=
  11806.       SET SESSION AUTHORIZATION <value specification>
  11807.  
  11808.   <set role statement> ::=
  11809.       SET ROLE ( <role name> | NONE )
  11810.  
  11811.   <set local time zone statement> ::=
  11812.       SET TIME ZONE
  11813.           <set time zone value>
  11814.  
  11815.   <set time zone value> ::=
  11816.         <interval value expression>
  11817.       | LOCAL
  11818.  
  11819.   <SQL diagnostics statement> ::=
  11820.       <get diagnostics statement>
  11821.  
  11822.   <get diagnostics statement> ::=
  11823.       GET DIAGNOSTICS <sql diagnostics information>
  11824.  
  11825.   <sql diagnostics information> ::=
  11826.         <statement information>
  11827.       | <condition information>
  11828.  
  11829.   <statement information> ::=
  11830.       <statement information item> [ ( <comma> <statement information item> )... ]
  11831.  
  11832.   <statement information item> ::=
  11833.       <simple target specification>
  11834.           <equals operator> <statement information item name>
  11835.  
  11836.   <statement information item name> ::=
  11837.         NUMBER
  11838.       | MORE
  11839.       | COMMAND_FUNCTION
  11840.       | ROW_COUNT
  11841.       | TRANSACTIONS_COMMITTED
  11842.       | TRANSACTIONS_ROLLED_BACK
  11843.       | TRANSACTION_ACTIVE
  11844.  
  11845.   <condition information> ::=
  11846.       EXCEPTION <condition number>
  11847.         <condition information item>
  11848.             [ ( <comma> <condition information item> )... ]
  11849.  
  11850.   <condition number> ::= <simple value specification>
  11851.  
  11852.   <condition information item> ::=
  11853.       <simple target specification>
  11854.           <equals operator> <condition information item name>
  11855.  
  11856.   <condition information item name> ::=
  11857.         CONDITION_NUMBER
  11858.       | RETURNED_SQLSTATE
  11859.       | CLASS_ORIGIN
  11860.       | SUBCLASS_ORIGIN
  11861.       | SERVER_NAME
  11862.       | CONNECTION_NAME
  11863.       | CONSTRAINT_CATALOG
  11864.       | CONSTRAINT_SCHEMA
  11865.       | CONSTRAINT_NAME
  11866.       | TRIGGER_CATALOG
  11867.       | TRIGGER_SCHEMA
  11868.       | TRIGGER_NAME
  11869.       | CATALOG_NAME
  11870.       | SCHEMA_NAME
  11871.       | TABLE_NAME
  11872.       | COLUMN_NAME
  11873.       | CURSOR_NAME
  11874.       | ROUTINE_CATALOG
  11875.       | ROUTINE_SCHEMA
  11876.       | ROUTINE_NAME
  11877.       | SPECIFIC_NAME
  11878.       | MESSAGE_TEXT
  11879.       | MESSAGE_LENGTH
  11880.       | MESSAGE_OCTET_LENGTH
  11881.  
  11882.   <order by clause> ::=
  11883.       ORDER BY <sort specification list>
  11884.  
  11885.   <updatability clause> ::=
  11886.       FOR
  11887.           ( READ ONLY |
  11888.             UPDATE [ OF <column name list> ] )
  11889.  
  11890.   <temporary abstract data type declaration> ::=
  11891.       DECLARE TEMPORARY TYPE <abstract data type name>
  11892.           <abstract data type body>
  11893.  
  11894.   <temporary table declaration> ::=
  11895.       DECLARE LOCAL TEMPORARY <table type> <table name>
  11896.         <table element list>
  11897.         [ ON COMMIT <table commit action> ROWS ]
  11898.  
  11899.   <temporary view declaration> ::=
  11900.       DECLARE TEMPORARY VIEW <table name>
  11901.           [ <left paren> <view column list> <right paren> ]
  11902.           AS <query expression>
  11903.  
  11904.   <scalar subquery> ::= <subquery>
  11905.  
  11906.   <regular expression> ::=
  11907.         <regular term>
  11908.       | <regular expression> <vertical bar> <regular term>
  11909.  
  11910.   <regular term> ::=
  11911.         <regular factor>
  11912.       | <regular term> <regular factor>
  11913.  
  11914.   <regular factor> ::=
  11915.         <regular primary>
  11916.       | <regular primary> <asterisk>
  11917.       | <regular primary> <plus sign>
  11918.  
  11919.   <regular primary> ::=
  11920.         <character specifier>
  11921.       | <percent>
  11922.       | <regular character set>
  11923.       | <left paren> <regular expression> <right paren>
  11924.  
  11925.   <character specifier> ::=
  11926.         <non-escaped character>
  11927.       | <escaped character>
  11928.  
  11929.   <non-escaped character> ::= !! <EMPHASIS>(See the Syntax Rules)
  11930.  
  11931.   <escaped character> ::= !! <EMPHASIS>(See the Syntax Rules)
  11932.  
  11933.   <regular character set> ::=
  11934.         <underscore>
  11935.       | <left bracket> <character enumeration>... <right bracket>
  11936.       | <left bracket> <circumflex> <character enumeration>... <right bracket>
  11937.       | <left bracket> <colon> <regular character set identifier> <colon> <right bracket>
  11938.  
  11939.   <character enumeration> ::=
  11940.         <character specifier>
  11941.       | <character specifier> <minus sign> <character specifier>
  11942.  
  11943.   <regular character set identifier> ::= <identifier>
  11944.  
  11945.   <SQL object identifier> ::=
  11946.       <SQL provenance> <SQL variant>
  11947.  
  11948.   <SQL provenance> ::= <arc1> <arc2> <arc3>
  11949.  
  11950.   <arc1> ::= iso | 1 | iso <left paren> 1 <right paren>
  11951.  
  11952.   <arc2> ::= standard | 0 | standard <left paren> 0 <right paren>
  11953.  
  11954.   <arc3> ::= 9075
  11955.  
  11956.   <SQL variant> ::= <SQL edition> <SQL conformance>
  11957.  
  11958.   <SQL edition> ::= <1987> | <1989> | <1992>
  11959.  
  11960.   <1987> ::= 0 | edition1987 <left paren> 0 <right paren>
  11961.  
  11962.   <1989> ::= <1989 base> <1989 package>
  11963.  
  11964.   <1989 base> ::= 1 | edition1989 <left paren> 1 <right paren>
  11965.  
  11966.   <1989 package> ::= <integrity no> | <integrity yes>
  11967.  
  11968.   <integrity no> ::= 0 | IntegrityNo <left paren> 0 <right paren>
  11969.  
  11970.   <integrity yes> ::= 1 | IntegrityYes <left paren> 1 <right paren>
  11971.  
  11972.   <1992> ::= 2 | edition1992 <left paren> 2 <right paren>
  11973.  
  11974.   <SQL conformance> ::= <low> | <intermediate> | <high>
  11975.  
  11976.   <low> ::= 0 | Low <left paren> 0 <right paren>
  11977.  
  11978.   <intermediate> ::= 1 | Intermediate <left paren> 1 <right paren>
  11979.  
  11980.   <high> ::= 2 | High <left paren> 2 <right paren>
  11981.  
  11982.   44.  Appendix C - SQL Tutorial for beginners
  11983.  
  11984.        SQL tutorial is also distributed with PostgreSQL. The SQL tutorial
  11985.        scripts is in the directory src/tutorial
  11986.  
  11987.   The SQL tutorial for beginners can be found at
  11988.   <http://w3.one.net/~jhoffman/sqltut.htm>
  11989.  
  11990.   Comments or suggestions? Mail to jhoffman@one.net
  11991.  
  11992.   Or you may wish to look at <http://w3.one.net/~jhoffman/index.html>
  11993.  
  11994.   The following are the sites suggested by John Hoffman:
  11995.  
  11996.   <http://www.contrib.andrew.cmu.edu/~shadow/sql.html>SQL Reference
  11997.  
  11998.   <http://www.inquiry.com/techtips/thesqlpro/>Ask the SQL Pro
  11999.  
  12000.   <http://www.inquiry.com/techtips/thesqlpro/usefulsites.html>SQL Pro's
  12001.   Relational DB Useful Sites
  12002.  
  12003.   <http://infoweb.magi.com/~steve/develop.html>Programmer's Source
  12004.  
  12005.   DBMS Sites <http://info.itu.ch/special/wwwfiles> Go here and see file
  12006.   comp_db.html
  12007.  
  12008.   <http://www.compapp.dcu.ie/databases/f017.html>DB Ingredients
  12009.  
  12010.   <http://www.stars.com/Tutorial/CGI/>Web Authoring
  12011.  
  12012.   <http://wfn-shop.princeton.edu/cgi-bin/foldoc>Computing Dictionary
  12013.  
  12014.   <http://www-ccs.cs.umass.edu/db.html>DBMS Lab/Links
  12015.  
  12016.   SQL FAQ <http://epoch.CS.Berkeley.EDU:8000/sequoia/dba/montage/FAQ> Go
  12017.   here and see file SQL_TOC.html
  12018.  
  12019.   <http://chaos.mur.csu.edu.au/itc125/cgi/sqldb.html>SQL Databases
  12020.  
  12021.   <http://www.it.rit.edu/~wjs/IT/199602/icsa720/icsa720postings.html>RIT
  12022.   Database Design Page
  12023.  
  12024.   <http://www.pcslink.com/~ej/dbweb.html>Database Jump Site
  12025.  
  12026.   <http://www.eng.uc.edu/~jtilley/tutorial.html>Programming Tutorials on
  12027.   the Web
  12028.  
  12029.   <http://www.ndev.com/ndc2/support/resources.htp>Development Resources
  12030.  
  12031.   <http://ashok.pair.com/sql.htm>Query List
  12032.  
  12033.   <http://jazz.external.hp.com/training/sqltables/main.html>IMAGE SQL
  12034.   Miscellaneous
  12035.  
  12036.   <http://www.eit.com/web/netservices.html>Internet Resource List
  12037.  
  12038.   Below is the extract from the home page of SQL tutorial.
  12039.  
  12040.   Introduction to Structured Query Language
  12041.  
  12042.   Version 3.31
  12043.  
  12044.   This page is a tutorial of the Structured Query Language (also known as SQL)
  12045.   and is a pioneering effort on the World Wide Web, as this is the first
  12046.   comprehensive SQL tutorial available on the Internet. SQL allows users to
  12047.   access data in relational database management systems, such as Oracle,
  12048.   Sybase, Informix, Microsoft SQL Server, Access, and others, by allowing
  12049.   users to describe the data the user wishes to see. SQL also allows users to
  12050.   define the data in a database, and manipulate that data. This page will
  12051.   describe how to use SQL, and give examples. The SQL used in this document is
  12052.   "ANSI", or standard SQL, and no SQL features of specific database management
  12053.   systems will be discussed until the "Nonstandard SQL" section. It is
  12054.   recommended that you print this page, so that you can easily refer back to
  12055.   previous examples.
  12056.   ----------------------------------------------------------------------------
  12057.   Table of Contents
  12058.  
  12059.        Basics of the SELECT Statement
  12060.        Conditional Selection
  12061.        Relational Operators
  12062.        Compound Conditions
  12063.        IN & BETWEEN
  12064.        Using LIKE
  12065.  
  12066.        Joins
  12067.        Keys
  12068.        Performing a Join
  12069.        Eliminating Duplicates
  12070.        Aliases & In/Subqueries
  12071.  
  12072.        Aggregate Functions
  12073.        Views
  12074.        Creating New Tables
  12075.        Altering Tables
  12076.        Adding Data
  12077.        Deleting Data
  12078.        Updating Data
  12079.  
  12080.        Indexes
  12081.        GROUP BY & HAVING
  12082.        More Subqueries
  12083.        EXISTS & ALL
  12084.        UNION & Outer Joins
  12085.        Embedded SQL
  12086.        Common SQL Questions
  12087.        Nonstandard SQL
  12088.        Syntax Summary
  12089.        Important Links
  12090.  
  12091.   ----------------------------------------------------------------------------
  12092.   Basics of the SELECT Statement
  12093.  
  12094.   In a relational database, data is stored in tables. An example table would
  12095.   relate Social Security Number, Name, and Address:
  12096.  
  12097.                           EmployeeAddressTable
  12098.  
  12099.    SSN      FirstName LastName  Address         City        State
  12100.    512687458Joe       Smith     83 First Street Howard      Ohio
  12101.    758420012Mary      Scott     842 Vine Ave.   LosantivilleOhio
  12102.    102254896Sam       Jones     33 Elm St.      Paris       New York
  12103.    876512563Sarah     Ackerman  440 U.S. 110    Upton       Michigan
  12104.  
  12105.   Now, let's say you want to see the address of each employee. Use the SELECT
  12106.   statement, like so:
  12107.  
  12108.   SELECT FirstName, LastName, Address, City, State
  12109.   FROM EmployeeAddressTable;
  12110.  
  12111.   The following is the results of your query of the database:
  12112.  
  12113.    First NameLast Name  Address          City         State
  12114.    Joe       Smith      83 First Street  Howard       Ohio
  12115.    Mary      Scott      842 Vine Ave.    Losantiville Ohio
  12116.    Sam       Jones      33 Elm St.       Paris        New York
  12117.    Sarah     Ackerman   440 U.S. 110     Upton        Michigan
  12118.  
  12119.   To explain what you just did, you asked for the all of data in the
  12120.   EmployeeAddressTable, and specifically, you asked for the columns called
  12121.   FirstName, LastName, Address, City, and State. Note that column names and
  12122.   table names do not have spaces...they must be typed as one word; and that
  12123.   the statement ends with a semicolon (;). The general form for a SELECT
  12124.   statement, retrieving all of the rows in the table is:
  12125.  
  12126.   SELECT ColumnName, ColumnName, ...
  12127.   FROM TableName;
  12128.  
  12129.   To get all columns of a table without typing all column names, use:
  12130.  
  12131.   SELECT * FROM TableName;
  12132.  
  12133.   Each database management system (DBMS) and database software has different
  12134.   methods for logging in to the database and entering SQL commands; see the
  12135.   local computer "guru" to help you get onto the system, so that you can use
  12136.   SQL.
  12137.   ----------------------------------------------------------------------------
  12138.   Conditional Selection
  12139.  
  12140.   To further discuss the SELECT statement, let's look at a new example table
  12141.   (for hypothetical purposes only):
  12142.  
  12143.                         EmployeeStatisticsTable
  12144.  
  12145.    EmployeeIDNo      Salary           Benefits         Position
  12146.    010               75000            15000            Manager
  12147.    105               65000            15000            Manager
  12148.    152               60000            15000            Manager
  12149.    215               60000            12500            Manager
  12150.    244               50000            12000            Staff
  12151.    300               45000            10000            Staff
  12152.    335               40000            10000            Staff
  12153.    400               32000            7500             Entry-Level
  12154.    441               28000            7500             Entry-Level
  12155.  
  12156.   ----------------------------------------------------------------------------
  12157.   Relational Operators
  12158.  
  12159.   There are six Relational Operators in SQL, and after introducing them, we'll
  12160.   see how they're used:
  12161.  
  12162.    =            Equal
  12163.    <> or !=
  12164.    (see manual) Not Equal
  12165.    <            Less Than
  12166.    >            Greater Than
  12167.    <=           Less Than or Equal To
  12168.  
  12169.    >=           Greater Than or Equal
  12170.                 To
  12171.  
  12172.   The WHERE clause is used to specify that only certain rows of the table are
  12173.   displayed, based on the criteria described in that WHERE clause. It is most
  12174.   easily understood by looking at a couple of examples.
  12175.  
  12176.   If you wanted to see the EMPLOYEEIDNO's of those making at or over 50,000,
  12177.   use the following:
  12178.  
  12179.   SELECT EMPLOYEEIDNO
  12180.   FROM EMPLOYEESTATISTICSTABLE
  12181.   WHERE SALARY >= 50000;
  12182.  
  12183.   Notice that the >= (greater than or equal to) sign is used, as we wanted to
  12184.   see those who made greater than 50,000, or equal to 50,000, listed
  12185.   together. This displays:
  12186.  
  12187.   EMPLOYEEIDNO
  12188.   ------------
  12189.   010
  12190.   105
  12191.   152
  12192.   215
  12193.   244
  12194.  
  12195.   The WHERE description, SALARY >= 50000, is known as a condition. The same
  12196.   can be done for text columns:
  12197.  
  12198.   SELECT EMPLOYEEIDNO
  12199.   FROM EMPLOYEESTATISTICSTABLE
  12200.   WHERE POSITION = 'Manager';
  12201.  
  12202.   This displays the ID Numbers of all Managers. Generally, with text columns,
  12203.   stick to equal to or not equal to, and make sure that any text that appears
  12204.   in the statement is surrounded by single quotes (').
  12205.  
  12206.   ----------------------------------------------------------------------------
  12207.   More Complex Conditions: Compound Conditions
  12208.  
  12209.   The AND operator joins two or more conditions, and displays a row only if
  12210.   that row's data satisfies ALL conditions listed (i.e. all conditions hold
  12211.   true). For example, to display all staff making over 40,000, use:
  12212.  
  12213.   SELECT EMPLOYEEIDNO
  12214.   FROM EMPLOYEESTATISTICSTABLE
  12215.   WHERE SALARY > 40000 AND POSITION = 'Staff';
  12216.  
  12217.   The OR operator joins two or more conditions, but returns a row if ANY of
  12218.   the conditions listed hold true. To see all those who make less than 40,000
  12219.   or have less than 10,000 in benefits, listed together, use the following
  12220.   query:
  12221.  
  12222.   SELECT EMPLOYEEIDNO
  12223.   FROM EMPLOYEESTATISTICSTABLE
  12224.   WHERE SALARY < 40000 OR BENEFITS < 10000;
  12225.  
  12226.   AND & OR can be combined, for example:
  12227.  
  12228.   SELECT EMPLOYEEIDNO
  12229.   FROM EMPLOYEESTATISTICSTABLE
  12230.   WHERE POSITION = 'Manager' AND SALARY > 60000 OR BENEFITS > 12000;
  12231.  
  12232.   First, SQL finds the rows where the salary is greater than 60,000 and the
  12233.   position column is equal to Manager, then taking this new list of rows, SQL
  12234.   then sees if any of these rows satisfies the previous AND condition or the
  12235.   condition that the Benefits column is greater then 12,000. Subsequently,
  12236.   SQL only displays this second new list of rows, keeping in mind that anyone
  12237.   with Benefits over 12,000 will be included as the OR operator includes a
  12238.   row if either resulting condition is True. Also note that the AND operation
  12239.   is done first.
  12240.  
  12241.   To generalize this process, SQL performs the AND operation(s) to determine
  12242.   the rows where the AND operation(s) hold true (remember: all of the
  12243.   conditions are true), then these results are used to compare with the
  12244.   OR conditions, and only display those remaining rows where the conditions
  12245.   joined by the OR operator hold true.
  12246.  
  12247.   To perform OR's before AND's, like if you wanted to see a list of employees
  12248.   making a large salary (>50,000) or have a large benefit package (>10,000),
  12249.   and that happen to be a manager, use parentheses:
  12250.  
  12251.   SELECT EMPLOYEEIDNO
  12252.   FROM EMPLOYEESTATISTICSTABLE
  12253.   WHERE POSITION = 'Manager' AND (SALARY > 50000 OR BENEFIT > 10000);
  12254.  
  12255.   ----------------------------------------------------------------------------
  12256.   IN & BETWEEN
  12257.  
  12258.   An easier method of using compound conditions uses IN or BETWEEN. For
  12259.   example, if you wanted to list all managers and staff:
  12260.  
  12261.   SELECT EMPLOYEEIDNO
  12262.   FROM EMPLOYEESTATISTICSTABLE
  12263.   WHERE POSITION IN ('Manager', 'Staff');
  12264.  
  12265.   or to list those making greater than or equal to 30,000, but less than or
  12266.   equal to 50,000, use:
  12267.  
  12268.   SELECT EMPLOYEEIDNO
  12269.   FROM EMPLOYEESTATISTICSTABLE
  12270.   WHERE SALARY BETWEEN 30000 AND 50000;
  12271.  
  12272.   To list everyone not in this range, try:
  12273.  
  12274.   SELECT EMPLOYEEIDNO
  12275.   FROM EMPLOYEESTATISTICSTABLE
  12276.   WHERE SALARY NOT BETWEEN 30000 AND 50000;
  12277.  
  12278.   Similarly, NOT IN lists all rows excluded from the IN list.
  12279.  
  12280.   ----------------------------------------------------------------------------
  12281.   Using LIKE
  12282.  
  12283.   Look at the EmployeeStatisticsTable, and say you wanted to see all people
  12284.   whose last names started with "L"; try:
  12285.  
  12286.   SELECT EMPLOYEEIDNO
  12287.   FROM EMPLOYEEADDRESSTABLE
  12288.   WHERE LASTNAME LIKE 'L%';
  12289.  
  12290.   The percent sign (%) is used to represent any possible character (number,
  12291.   letter, or punctuation) or set of characters that might appear after the
  12292.   "L". To find those people with LastName's ending in "L", use '%L', or if you
  12293.   wanted the "L" in the middle of the word, try '%L%'. The '%' can be used for
  12294.   any characters, in that relative position to the given characters. NOT LIKE
  12295.   displays rows not fitting the given description. Other possiblities of using
  12296.   LIKE, or any of these discussed conditionals, are available, though it
  12297.   depends on what DBMS you are using; as usual, consult a manual or your
  12298.   system manager or administrator for the available features on your system,
  12299.   or just to make sure that what you are trying to do is available and
  12300.   allowed. This disclaimer holds for the features of SQL that will be
  12301.   discussed below. This section is just to give you an idea of the
  12302.   possibilities of queries that can be written in SQL.
  12303.   ----------------------------------------------------------------------------
  12304.   Joins
  12305.  
  12306.   In this section, we will only discuss inner joins, and equijoins, as in
  12307.   general, they are the most useful. For more information, try the SQL links
  12308.   at the bottom of the page.
  12309.  
  12310.   Good database design suggests that each table lists data only about a single
  12311.   entity, and detailed information can be obtained in a relational database,
  12312.   by using additional tables, and by using a join.
  12313.  
  12314.   First, take a look at these example tables:
  12315.  
  12316.               AntiqueOwners
  12317.  
  12318.    OwnerIDOwnerLastName OwnerFirstName
  12319.    01     Jones         Bill
  12320.    02     Smith         Bob
  12321.    15     Lawson        Patricia
  12322.    21     Akins         Jane
  12323.    50     Fowler        Sam
  12324.  
  12325.   ---------------------------------------------------------
  12326.  
  12327.          Orders
  12328.  
  12329.    OwnerIDItemDesired
  12330.    02     Table
  12331.    02     Desk
  12332.    21     Chair
  12333.    15     Mirror
  12334.  
  12335.   --------------------------------------
  12336.  
  12337.              Antiques
  12338.  
  12339.    SellerIDBuyerID Item
  12340.    01      50      Bed
  12341.    02      15      Table
  12342.    15      02      Chair
  12343.    21      50      Mirror
  12344.    50      01      Desk
  12345.    01      21      Cabinet
  12346.    02      21      Coffee Table
  12347.    15      50      Chair
  12348.    01      15      Jewelry Box
  12349.    02      21      Pottery
  12350.    21      02      Bookcase
  12351.    50      01      Plant Stand
  12352.  
  12353.   ----------------------------------------------------------------------------
  12354.   Keys
  12355.  
  12356.   First, let's discuss the concept of keys. A primary key is a column or set
  12357.   of columns that uniquely identifies the rest of the data in any given row.
  12358.   For example, in the AntiqueOwners table, the OwnerID column uniquely
  12359.   identifies that row. This means two things: no two rows can have the same
  12360.   OwnerID, and, even if two owners have the same first and last names, the
  12361.   OwnerID column ensures that the two owners will not be confused with each
  12362.   other, because the unique OwnerID column will be used throughout the
  12363.   database to track the owners, rather than the names.
  12364.  
  12365.   A foreign key is a column in a table where that column is a primary key of
  12366.   another table, which means that any data in a foreign key column must have
  12367.   corresponding data in the other table where that column is the primary key.
  12368.   In DBMS-speak, this correspondence is known as referential integrity. For
  12369.   example, in the Antiques table, both the BuyerID and SellerID are foreign
  12370.   keys to the primary key of the AntiqueOwners table (OwnerID; for purposes of
  12371.   argument, one has to be an Antique Owner before one can buy or sell any
  12372.   items), as, in both tables, the ID rows are used to identify the owners or
  12373.   buyers and sellers, and that the OwnerID is the primary key of the
  12374.   AntiqueOwners table. In other words, all of this "ID" data is used to refer
  12375.   to the owners, buyers, or sellers of antiques, themselves, without having to
  12376.   use the actual names.
  12377.  
  12378.   ----------------------------------------------------------------------------
  12379.   Performing a Join
  12380.  
  12381.   The purpose of these keys is so that data can be related across tables,
  12382.   without having to repeat data in every table--this is the power of
  12383.   relational databases. For example, you can find the names of those who
  12384.   bought a chair without having to list the full name of the buyer in the
  12385.   Antiques table...you can get the name by relating those who bought a chair
  12386.   with the names in the AntiqueOwners table through the use of the OwnerID,
  12387.   which relates the data in the two tables. To find the names of those who
  12388.   bought a chair, use the following query:
  12389.  
  12390.   SELECT OWNERLASTNAME, OWNERFIRSTNAME
  12391.   FROM ANTIQUEOWNERS, ANTIQUES
  12392.   WHERE BUYERID = OWNERID AND ITEM = 'Chair';
  12393.  
  12394.   Note the following about this query...notice that both tables involved in
  12395.   the relation are listed in the FROM clause of the statement. In the WHERE
  12396.   clause, first notice that the ITEM = 'Chair' part restricts the listing to
  12397.   those who have bought (and in this example, thereby owns) a chair. Secondly,
  12398.   notice how the ID columns are related from one table to the next by use of
  12399.   the BUYERID = OWNERID clause. Only where ID's match across tables and the
  12400.   item purchased is a chair (because of the AND), will the names from the
  12401.   AntiqueOwners table be listed. Because the joining condition used an equal
  12402.   sign, this join is called an equijoin. The result of this query is two
  12403.   names: Smith, Bob & Fowler, Sam.
  12404.  
  12405.   Dot notation refers to prefixing the table names to column names, to avoid
  12406.   ambiguity, as such:
  12407.  
  12408.   SELECT ANTIQUEOWNERS.OWNERLASTNAME, ANTIQUEOWNERS.OWNERFIRSTNAME
  12409.   FROM ANTIQUEOWNERS, ANTIQUES
  12410.   WHERE ANTIQUES.BUYERID = ANTIQUEOWNERS.OWNERID AND ANTIQUES.ITEM = 'Chair';
  12411.  
  12412.   As the column names are different in each table, however, this wasn't
  12413.   necessary.
  12414.  
  12415.   ----------------------------------------------------------------------------
  12416.   DISTINCT and Eliminating Duplicates
  12417.  
  12418.   Let's say that you want to list the ID and names of only those people who
  12419.   have sold an antique. Obviously, you want a list where each seller is only
  12420.   listed once--you don't want to know how many antiques a person sold, just
  12421.   the fact that this person sold one (for counts, see the Aggregate Function
  12422.   section below). This means that you will need to tell SQL to eliminate
  12423.   duplicate sales rows, and just list each person only once. To do this, use
  12424.   the DISTINCT keyword.
  12425.  
  12426.   First, we will need an equijoin to the AntiqueOwners table to get the detail
  12427.   data of the person's LastName and FirstName. However, keep in mind that
  12428.   since the SellerID column in the Antiques table is a foreign key to the
  12429.   AntiqueOwners table, a seller will only be listed if there is a row in the
  12430.   AntiqueOwners table listing the ID and names. We also want to eliminate
  12431.   multiple occurences of the SellerID in our listing, so we use DISTINCT on
  12432.   the column where the repeats may occur.
  12433.  
  12434.   To throw in one more twist, we will also want the list alphabetized by
  12435.   LastName, then by FirstName (on a LastName tie), then by OwnerID (on a
  12436.   LastName and FirstName tie). Thus, we will use the ORDER BY clause:
  12437.  
  12438.   SELECT DISTINCT SELLERID, OWNERLASTNAME, OWNERFIRSTNAME
  12439.   FROM ANTIQUES, ANTIQUEOWNERS
  12440.   WHERE SELLERID = OWNERID
  12441.   ORDER BY OWNERLASTNAME, OWNERFIRSTNAME, OWNERID;
  12442.  
  12443.   In this example, since everyone has sold an item, we will get a listing of
  12444.   all of the owners, in alphabetical order by last name. For future reference
  12445.   (and in case anyone asks), this type of join is considered to be in the
  12446.   category of inner joins.
  12447.  
  12448.   ----------------------------------------------------------------------------
  12449.   Aliases & In/Subqueries
  12450.  
  12451.   In this section, we will talk about Aliases, In and the use of subqueries,
  12452.   and how these can be used in a 3-table example. First, look at this query
  12453.   which prints the last name of those owners who have placed an order and what
  12454.   the order is, only listing those orders which can be filled (that is, there
  12455.   is a buyer who owns that ordered item):
  12456.  
  12457.   SELECT OWN.OWNERLASTNAME Last Name, ORD.ITEMDESIRED Item Ordered
  12458.   FROM ORDERS ORD, ANTIQUEOWNERS OWN
  12459.   WHERE ORD.OWNERID = OWN.OWNERID
  12460.   AND ORD.ITEMDESIRED IN
  12461.  
  12462.        (SELECT ITEM
  12463.        FROM ANTIQUES);
  12464.  
  12465.   This gives:
  12466.  
  12467.   Last Name Item Ordered
  12468.   --------- ------------
  12469.   Smith     Table
  12470.   Smith     Desk
  12471.   Akins     Chair
  12472.   Lawson    Mirror
  12473.  
  12474.   There are several things to note about this query:
  12475.  
  12476.     1. First, the "Last Name" and "Item Ordered" in the Select lines gives the
  12477.        headers on the report.
  12478.     2. The OWN & ORD are aliases; these are new names for the two tables
  12479.        listed in the FROM clause that are used as prefixes for all dot
  12480.        notations of column names in the query (see above). This eliminates
  12481.        ambiguity, especially in the equijoin WHERE clause where both tables
  12482.        have the column named OwnerID, and the dot notation tells SQL that we
  12483.        are talking about two different OwnerID's from the two different
  12484.        tables.
  12485.     3. Note that the Orders table is listed first in the FROM clause; this
  12486.        makes sure listing is done off of that table, and the AntiqueOwners
  12487.        table is only used for the detail information (Last Name).
  12488.     4. Most importantly, the AND in the WHERE clause forces the In Subquery to
  12489.        be invoked ("= ANY" or "= SOME" are two equivalent uses of IN). What
  12490.        this does is, the subquery is performed, returning all of the Items
  12491.        owned from the Antiques table, as there is no WHERE clause. Then, for a
  12492.        row from the Orders table to be listed, the ItemDesired must be in that
  12493.        returned list of Items owned from the Antiques table, thus listing an
  12494.        item only if the order can be filled from another owner. You can think
  12495.        of it this way: the subquery returns a set of Items from which each
  12496.        ItemDesired in the Orders table is compared; the In condition is true
  12497.        only if the ItemDesired is in that returned set from the Antiques
  12498.        table.
  12499.     5. Also notice, that in this case, that there happened to be an antique
  12500.        available for each one desired...obviously, that won't always be the
  12501.        case. In addition, notice that when the IN, "= ANY", or "= SOME" is
  12502.        used, that these keywords refer to any possible row matches, not column
  12503.        matches...that is, you cannot put multiple columns in the subquery
  12504.        Select clause, in an attempt to match the column in the outer Where
  12505.        clause to one of multiple possible column values in the subquery; only
  12506.        one column can be listed in the subquery, and the possible match comes
  12507.        from multiple row values in that one column, not vice-versa.
  12508.  
  12509.   Whew! That's enough on the topic of complex SELECT queries for now. Now on
  12510.   to other SQL statements.
  12511.   ----------------------------------------------------------------------------
  12512.   Miscellaneous SQL Statements
  12513.  
  12514.   Aggregate Functions
  12515.  
  12516.   I will discuss five important aggregate functions: SUM, AVG, MAX, MIN, and
  12517.   COUNT. They are called aggregate functions because they summarize the
  12518.   results of a query, rather than listing all of the rows.
  12519.  
  12520.      * SUM () gives the total of all the rows, satisfying any conditions, of
  12521.        the given column, where the given column is numeric.
  12522.      * AVG () gives the average of the given column.
  12523.      * MAX () gives the largest figure in the given column.
  12524.      * MIN () gives the smallest figure in the given column.
  12525.      * COUNT(*) gives the number of rows satisfying the conditions.
  12526.  
  12527.   Looking at the tables at the top of the document, let's look at three
  12528.   examples:
  12529.  
  12530.   SELECT SUM(SALARY), AVG(SALARY)
  12531.   FROM EMPLOYEESTATISTICSTABLE;
  12532.  
  12533.   This query shows the total of all salaries in the table, and the average
  12534.   salary of all of the entries in the table.
  12535.  
  12536.   SELECT MIN(BENEFITS)
  12537.   FROM EMPLOYEESTATISTICSTABLE
  12538.   WHERE POSITION = 'Manager';
  12539.  
  12540.   This query gives the smallest figure of the Benefits column, of the
  12541.   employees who are Managers, which is 12500.
  12542.  
  12543.   SELECT COUNT(*)
  12544.   FROM EMPLOYEESTATISTICSTABLE
  12545.   WHERE POSITION = 'Staff';
  12546.  
  12547.   This query tells you how many employees have Staff status (3).
  12548.  
  12549.   ----------------------------------------------------------------------------
  12550.   Views
  12551.  
  12552.   In SQL, you might (check your DBA) have access to create views for yourself.
  12553.   What a view does is to allow you to assign the results of a query to a new,
  12554.   personal table, that you can use in other queries, where this new table is
  12555.   given the view name in your FROM clause. When you access a view, the query
  12556.   that is defined in your view creation statement is performed (generally),
  12557.   and the results of that query look just like another table in the query that
  12558.   you wrote invoking the view. For example, to create a view:
  12559.  
  12560.   CREATE VIEW ANTVIEW AS SELECT ITEMDESIRED FROM ORDERS;
  12561.  
  12562.   Now, write a query using this view as a table, where the table is just a
  12563.   listing of all Items Desired from the Orders table:
  12564.  
  12565.   SELECT SELLERID
  12566.   FROM ANTIQUES, ANTVIEW
  12567.   WHERE ITEMDESIRED = ITEM;
  12568.   This query shows all SellerID's from the Antiques table where the Item in
  12569.   that table happens to appear in the Antview view, which is just all of the
  12570.   Items Desired in the Orders table. The listing is generated by going through
  12571.   the Antique Items one-by-one until there's a match with the Antview view.
  12572.   Views can be used to restrict database access, as well as, in this case,
  12573.   simplify a complex query.
  12574.  
  12575.   ----------------------------------------------------------------------------
  12576.   Creating New Tables
  12577.  
  12578.   All tables within a database must be created at some point in time...let's
  12579.   see how we would create the Orders table:
  12580.  
  12581.   CREATE TABLE ORDERS
  12582.   (OWNERID INTEGER NOT NULL,
  12583.   ITEMDESIRED CHAR(40) NOT NULL);
  12584.  
  12585.   This statement gives the table name and tells the DBMS about each column in
  12586.   the table. Please note that this statement uses generic data types, and that
  12587.   the data types might be different, depending on what DBMS you are using. As
  12588.   usual, check local listings. Some common generic data types are:
  12589.  
  12590.      * Char(x) - A column of characters, where x is a number designating the
  12591.        maximum number of characters allowed (maximum length) in the column.
  12592.      * Integer - A column of whole numbers, positive or negative.
  12593.      * Decimal(x, y) - A column of decimal numbers, where x is the maximum
  12594.        length in digits of the decimal numbers in this column, and y is the
  12595.        maximum number of digits allowed after the decimal point. The maximum
  12596.        (4,2) number would be 99.99.
  12597.      * Date - A date column in a DBMS-specific format.
  12598.      * Logical - A column that can hold only two values: TRUE or FALSE.
  12599.  
  12600.   One other note, the NOT NULL means that the column must have a value in each
  12601.   row. If NULL was used, that column may be left empty in a given row.
  12602.  
  12603.   ----------------------------------------------------------------------------
  12604.   Altering Tables
  12605.  
  12606.   Let's add a column to the Antiques table to allow the entry of the price of
  12607.   a given Item:
  12608.  
  12609.   ALTER TABLE ANTIQUES ADD (PRICE DECIMAL(8,2) NULL);
  12610.  
  12611.   The data for this new column can be updated or inserted as shown later.
  12612.  
  12613.   ----------------------------------------------------------------------------
  12614.   Adding Data
  12615.  
  12616.   To insert rows into a table, do the following:
  12617.  
  12618.   INSERT INTO ANTIQUES VALUES (21, 01, 'Ottoman', 200.00);
  12619.  
  12620.   This inserts the data into the table, as a new row, column-by-column, in the
  12621.   pre-defined order. Instead, let's change the order and leave Price blank:
  12622.  
  12623.   INSERT INTO ANTIQUES (BUYERID, SELLERID, ITEM)
  12624.   VALUES (01, 21, 'Ottoman');
  12625.  
  12626.   ----------------------------------------------------------------------------
  12627.   Deleting Data
  12628.  
  12629.   Let's delete this new row back out of the database:
  12630.  
  12631.   DELETE FROM ANTIQUES
  12632.   WHERE ITEM = 'Ottoman';
  12633.  
  12634.   But if there is another row that contains 'Ottoman', that row will be
  12635.   deleted also. Let's delete all rows (one, in this case) that contain the
  12636.   specific data we added before:
  12637.  
  12638.   DELETE FROM ANTIQUES
  12639.   WHERE ITEM = 'Ottoman' AND BUYERID = 01 AND SELLERID = 21;
  12640.  
  12641.   ----------------------------------------------------------------------------
  12642.   Updating Data
  12643.  
  12644.   Let's update a Price into a row that doesn't have a price listed yet:
  12645.  
  12646.   UPDATE ANTIQUES SET PRICE = 500.00 WHERE ITEM = 'Chair';
  12647.  
  12648.   This sets all Chair's Prices to 500.00. As shown above, more WHERE
  12649.   conditionals, using AND, must be used to limit the updating to more specific
  12650.   rows. Also, additional columns may be set by separating equal statements
  12651.   with commas.
  12652.  
  12653.   ----------------------------------------------------------------------------
  12654.   Miscellaneous Topics
  12655.  
  12656.   Indexes
  12657.  
  12658.   Indexes allow a DBMS to access data quicker (please note: this feature is
  12659.   nonstandard/not available on all systems). The system creates this internal
  12660.   data structure (the index) which causes selection of rows, when the
  12661.   selection is based on indexed columns, to occur faster. This index tells the
  12662.   DBMS where a certain row is in the table given an indexed-column value, much
  12663.   like a book index tells you what page a given word appears. Let's create an
  12664.   index for the OwnerID in the AntiqueOwners column:
  12665.  
  12666.   CREATE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);
  12667.  
  12668.   Now on the names:
  12669.  
  12670.   CREATE INDEX NAME_IDX ON ANTIQUEOWNERS (OWNERLASTNAME, OWNERFIRSTNAME);
  12671.  
  12672.   To get rid of an index, drop it:
  12673.  
  12674.   DROP INDEX OID_IDX;
  12675.  
  12676.   By the way, you can also "drop" a table, as well (careful!--that means that
  12677.   your table is deleted). In the second example, the index is kept on the two
  12678.   columns, aggregated together--strange behavior might occur in this
  12679.   situation...check the manual before performing such an operation.
  12680.  
  12681.   Some DBMS's do not enforce primary keys; in other words, the uniqueness of a
  12682.   column is not enforced automatically. What that means is, if, for example, I
  12683.   tried to insert another row into the AntiqueOwners table with an OwnerID of
  12684.   02, some systems will allow me to do that, even though, we do not, as that
  12685.   column is supposed to be unique to that table (every row value is supposed
  12686.   to be different). One way to get around that is to create a unique index on
  12687.   the column that we want to be a primary key, to force the system to enforce
  12688.   prohibition of duplicates:
  12689.  
  12690.   CREATE UNIQUE INDEX OID_IDX ON ANTIQUEOWNERS (OWNERID);
  12691.  
  12692.   ----------------------------------------------------------------------------
  12693.   GROUP BY & HAVING
  12694.  
  12695.   One special use of GROUP BY is to associate an aggregate function
  12696.   (especially COUNT; counting the number of rows in each group) with groups of
  12697.   rows. First, assume that the Antiques table has the Price column, and each
  12698.   row has a value for that column. We want to see the price of the most
  12699.   expensive item bought by each owner. We have to tell SQL to group each
  12700.   owner's purchases, and tell us the maximum purchase price:
  12701.  
  12702.   SELECT BUYERID, MAX(PRICE)
  12703.   FROM ANTIQUES
  12704.   GROUP BY BUYERID;
  12705.  
  12706.   Now, say we only want to see the maximum purchase price if the purchase is
  12707.   over 1000, so we use the HAVING clause:
  12708.  
  12709.   SELECT BUYERID, MAX(PRICE)
  12710.   FROM ANTIQUES
  12711.   GROUP BY BUYERID
  12712.   HAVING PRICE > 1000;
  12713.  
  12714.   ----------------------------------------------------------------------------
  12715.   More Subqueries
  12716.  
  12717.   Another common usage of subqueries involves the use of operators to allow a
  12718.   Where condition to include the Select output of a subquery. First, list the
  12719.   buyers who purchased an expensive item (the Price of the item is 100
  12720.   greater than the average price of all items purchased):
  12721.  
  12722.   SELECT OWNERID
  12723.   FROM ANTIQUES
  12724.   WHERE PRICE >
  12725.  
  12726.        (SELECT AVG(PRICE) + 100
  12727.        FROM ANTIQUES);
  12728.  
  12729.   The subquery calculates the average Price, plus 100, and using that figure,
  12730.   an OwnerID is printed for every item costing over that figure. One could use
  12731.   DISTINCT OWNERID, to eliminate duplicates.
  12732.  
  12733.   List the Last Names of those in the AntiqueOwners table, ONLY if they have
  12734.   bought an item:
  12735.  
  12736.   SELECT OWNERLASTNAME
  12737.   FROM ANTIQUEOWNERS
  12738.   WHERE OWNERID =
  12739.  
  12740.        (SELECT DISTINCT BUYERID
  12741.        FROM ANTIQUES);
  12742.  
  12743.   The subquery returns a list of buyers, and the Last Name is printed for an
  12744.   Antique Owner if and only if the Owner's ID appears in the subquery list
  12745.   (sometimes called a candidate list).
  12746.  
  12747.   For an Update example, we know that the gentleman who bought the bookcase
  12748.   has the wrong First Name in the database...it should be John:
  12749.  
  12750.   UPDATE ANTIQUEOWNERS
  12751.   SET OWNERFIRSTNAME = 'John'
  12752.   WHERE OWNERID =
  12753.  
  12754.        (SELECT BUYERID
  12755.        FROM ANTIQUES
  12756.        WHERE ITEM = 'Bookcase');
  12757.  
  12758.   First, the subquery finds the BuyerID for the person(s) who bought the
  12759.   Bookcase, then the outer query updates his First Name.
  12760.  
  12761.   Remember this rule about subqueries: when you have a subquery as part of a
  12762.   WHERE condition, the Select clause in the subquery must have columns that
  12763.   match in number and type to those in the Where clause of the outer query. In
  12764.   other words, if you have "WHERE ColumnName = (SELECT...);", the Select must
  12765.   have only one column in it, to match the ColumnName in the outer Where
  12766.   clause, and they must match in type (both being integers, both being
  12767.   character strings, etc.).
  12768.  
  12769.   ----------------------------------------------------------------------------
  12770.   EXISTS & ALL
  12771.  
  12772.   EXISTS uses a subquery as a condition, where the condition is True if the
  12773.   subquery returns any rows, and False if the subquery does not return any
  12774.   rows; this is a nonintuitive feature with few unique uses. However, if a
  12775.   prospective customer wanted to see the list of Owners only if the shop dealt
  12776.   in Chairs, try:
  12777.  
  12778.   SELECT OWNERFIRSTNAME, OWNERLASTNAME
  12779.   FROM ANTIQUEOWNERS
  12780.   WHERE EXISTS
  12781.  
  12782.        (SELECT *
  12783.        FROM ANTIQUES
  12784.        WHERE ITEM = 'Chair');
  12785.  
  12786.   If there are any Chairs in the Antiques column, the subquery would return a
  12787.   row or rows, making the EXISTS clause true, causing SQL to list the Antique
  12788.   Owners. If there had been no Chairs, no rows would have been returned by the
  12789.   outside query.
  12790.  
  12791.   ALL is another unusual feature, as ALL queries can usually be done with
  12792.   different, and possibly simpler methods; let's take a look at an example
  12793.   query:
  12794.  
  12795.   SELECT BUYERID, ITEM
  12796.   FROM ANTIQUES
  12797.   WHERE PRICE >= ALL
  12798.  
  12799.        (SELECT PRICE
  12800.        FROM ANTIQUES);
  12801.  
  12802.   This will return the largest priced item (or more than one item if there is
  12803.   a tie), and its buyer. The subquery returns a list of all Prices in the
  12804.   Antiques table, and the outer query goes through each row of the Antiques
  12805.   table, and if its Price is greater than or equal to every (or ALL) Prices in
  12806.   the list, it is listed, giving the highest priced Item. The reason ">=" must
  12807.   be used is that the highest priced item will be equal to the highest price
  12808.   on the list, because this Item is in the Price list.
  12809.  
  12810.   ----------------------------------------------------------------------------
  12811.   UNION & Outer Joins
  12812.  
  12813.   There are occasions where you might want to see the results of multiple
  12814.   queries together, combining their output; use UNION. To merge the output of
  12815.   the following two queries, displaying the ID's of all Buyers, plus all those
  12816.   who have an Order placed:
  12817.  
  12818.   SELECT BUYERID
  12819.   FROM ANTIQUEOWNERS
  12820.   UNION
  12821.   SELECT OWNERID
  12822.   FROM ORDERS;
  12823.  
  12824.   Notice that SQL requires that the Select list (of columns) must match,
  12825.   column-by-column, in data type. In this case BuyerID and OwnerID are of the
  12826.   same data type (integer). Also notice that SQL does automatic duplicate
  12827.   elimination when using UNION (as if they were two "sets"); in single
  12828.   queries, you have to use DISTINCT.
  12829.  
  12830.   The outer join is used when a join query is "united" with the rows not
  12831.   included in the join, and are especially useful if constant text "flags" are
  12832.   included. First, look at the query:
  12833.  
  12834.   SELECT OWNERID, 'is in both Orders & Antiques'
  12835.   FROM ORDERS, ANTIQUES
  12836.   WHERE OWNERID = BUYERID
  12837.   UNION
  12838.   SELECT BUYERID, 'is in Antiques only'
  12839.   FROM ANTIQUES
  12840.   WHERE BUYERID NOT IN
  12841.  
  12842.        (SELECT OWNERID
  12843.        FROM ORDERS);
  12844.  
  12845.   The first query does a join to list any owners who are in both tables, and
  12846.   putting a tag line after the ID repeating the quote. The UNION merges this
  12847.   list with the next list. The second list is generated by first listing those
  12848.   ID's not in the Orders table, thus generating a list of ID's excluded from
  12849.   the join query. Then, each row in the Antiques table is scanned, and if the
  12850.   BuyerID is not in this exclusion list, it is listed with its quoted tag.
  12851.   There might be an easier way to make this list, but it's difficult to
  12852.   generate the informational quoted strings of text.
  12853.  
  12854.   This concept is useful in situations where a primary key is related to a
  12855.   foreign key, but the foreign key value for some primary keys is NULL. For
  12856.   example, in one table, the primary key is a salesperson, and in another
  12857.   table is customers, with their salesperson listed in the same row. However,
  12858.   if a salesperson has no customers, that person's name won't appear in the
  12859.   customer table. The outer join is used if the listing of all sales person is
  12860.   to be printed, listed with their customers, whether the salesperson has a
  12861.   customer or not--that is, no customer is printed (a logical NULL value) if
  12862.   the salesperson has no customers, but is in the sales person table.
  12863.   Otherwise, the salesperson will be listed with each customer.
  12864.  
  12865.   ENOUGH QUERIES!!! you say?...now on to something completely different...
  12866.  
  12867.   ----------------------------------------------------------------------------
  12868.   Embedded SQL--an ugly example (do not write a program like this...for
  12869.   purposes of argument ONLY)
  12870.  
  12871.   /* -To get right to it, here is an example program that uses Embedded
  12872.       SQL. Embedded SQL allows programmers to connect to a database and
  12873.       include SQL code right in the program, so that their programs can
  12874.       use, manipulate, and process data from a database.
  12875.      -This example C Program (using Embedded SQL) will print a report.
  12876.      -This program will have to be precompiled for the SQL statements,
  12877.       before regular compilation.
  12878.      -The EXEC SQL parts are the same (standard), but the surrounding C
  12879.       code will need to be changed, including the host variable
  12880.       declarations, if you are using a different language.
  12881.      -Embedded SQL changes from system to system, so, once again, check
  12882.       local documentation, especially variable declarations and logging
  12883.       in procedures, in which network, DBMS, and operating system
  12884.       considerations are crucial. */
  12885.  
  12886.   /************************************************/
  12887.   /* THIS PROGRAM IS NOT COMPILABLE OR EXECUTABLE */
  12888.   /* IT IS FOR EXAMPLE PURPOSES ONLY              */
  12889.   /************************************************/
  12890.  
  12891.   #include <stdio.h>
  12892.  
  12893.   /* This section declares the host variables; these will be the
  12894.      variables your program uses, but also the variable SQL will put
  12895.      values in or take values out. */
  12896.   EXEC SQL BEGIN DECLARE SECTION;
  12897.     int BuyerID;
  12898.     char FirstName[100], LastName[100], Item[100];
  12899.   EXEC SQL END DECLARE SECTION;
  12900.  
  12901.   /* This includes the SQLCA variable, so that some error checking can be
  12902.   done. */
  12903.   EXEC SQL INCLUDE SQLCA;
  12904.  
  12905.   main() (
  12906.  
  12907.   /* This is a possible way to log into the database */
  12908.   EXEC SQL CONNECT UserID/Password;
  12909.  
  12910.   /* This code either says that you are connected or checks if an error
  12911.      code was generated, meaning log in was incorrect or not possible. */
  12912.     if(sqlca.sqlcode) (
  12913.       printf(Printer, "Error connecting to database server.\n");
  12914.       exit();
  12915.     )
  12916.     printf("Connected to database server.\n");
  12917.  
  12918.   /* This declares a "Cursor". This is used when a query returns more
  12919.      than one row, and an operation is to be performed on each row
  12920.      resulting from the query. With each row established by this query,
  12921.      I'm going to use it in the report. Later, "Fetch" will be used to
  12922.      pick off each row, one at a time, but for the query to actually
  12923.      be executed, the "Open" statement is used. The "Declare" just
  12924.      establishes the query. */
  12925.   EXEC SQL DECLARE ItemCursor CURSOR FOR
  12926.     SELECT ITEM, BUYERID
  12927.     FROM ANTIQUES
  12928.     ORDER BY ITEM;
  12929.   EXEC SQL OPEN ItemCursor;
  12930.  
  12931.   /* +-- You may wish to put a similar error checking block here --+ */
  12932.  
  12933.   /* Fetch puts the values of the "next" row of the query in the host
  12934.      variables, respectively. However, a "priming fetch" (programming
  12935.      technique) must first be done. When the cursor is out of data, a
  12936.      sqlcode will be generated allowing us to leave the loop. Notice
  12937.      that, for simplicity's sake, the loop will leave on any sqlcode,
  12938.      even if it is an error code. Otherwise, specific code checking must
  12939.      be performed. */
  12940.   EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;
  12941.     while(!sqlca.sqlcode) (
  12942.  
  12943.   /* With each row, we will also do a couple of things. First, bump the
  12944.      price up by 5 (dealer's fee) and get the buyer's name to put in
  12945.      the report. To do this, I'll use an Update and a Select, before
  12946.      printing the line on the screen. The update assumes however, that
  12947.      a given buyer has only bought one of any given item, or else the
  12948.      price will be increased too many times. Otherwise, a "RowID" logic
  12949.      would have to be used (see documentation). Also notice the colon
  12950.      before host variable names when used inside of SQL statements. */
  12951.  
  12952.   EXEC SQL UPDATE ANTIQUES
  12953.     SET PRICE = PRICE + 5
  12954.     WHERE ITEM = :Item AND BUYERID = :BuyerID;
  12955.  
  12956.   EXEC SQL SELECT OWNERFIRSTNAME, OWNERLASTNAME
  12957.     INTO :FirstName, :LastName
  12958.     FROM ANTIQUEOWNERS
  12959.     WHERE BUYERID = :BuyerID;
  12960.  
  12961.       printf("%25s %25s %25s", FirstName, LastName, Item);
  12962.  
  12963.   /* Ugly report--for example purposes only! Get the next row. */
  12964.   EXEC SQL FETCH ItemCursor INTO :Item, :BuyerID;
  12965.     )
  12966.  
  12967.   /* Close the cursor, commit the changes (see below), and exit the
  12968.      program. */
  12969.   EXEC SQL CLOSE DataCursor;
  12970.   EXEC SQL COMMIT RELEASE;
  12971.     exit();
  12972.   )
  12973.  
  12974.   ----------------------------------------------------------------------------
  12975.   Common SQL Questions--Advanced Topics (see FAQ link for several more)
  12976.  
  12977.     1. Why can't I just ask for the first three rows in a table? --Because in
  12978.        relational databases, rows are inserted in no particular order, that
  12979.        is, the system inserts them in an arbitrary order; so, you can only
  12980.        request rows using valid SQL features, like ORDER BY, etc.
  12981.     2. What is this DDL and DML I hear about? --DDL (Data Definition Language)
  12982.        refers to (in SQL) the Create Table statement...DML (Data Manipulation
  12983.        Language) refers to the Select, Update, Insert, and Delete statements.
  12984.     3. Aren't database tables just files? --Well, DBMS's store data in files
  12985.        declared by system managers before new tables are created (on large
  12986.        systems), but the system stores the data in a special format, and may
  12987.        spread data from one table over several files. In the database world, a
  12988.        set of files created for a database is called a tablespace. In general,
  12989.        on small systems, everything about a database (definitions and all
  12990.        table data) is kept in one file.
  12991.     4. (Related question) Aren't database tables just like spreadsheets? --No,
  12992.        for two reasons. First, spreadsheets can have data in a cell, but a
  12993.        cell is more than just a row-column-intersection. Depending on your
  12994.        spreadsheet software, a cell might also contain formulas and
  12995.        formatting, which database tables cannot have (currently). Secondly,
  12996.        spreadsheet cells are often dependent on the data in other cells. In
  12997.        databases, "cells" are independent, except that columns are logically
  12998.        related (hopefully; together a row of columns describe an entity), and,
  12999.        other than primary key and foreign key constraints, each row in a table
  13000.        in independent from one another.
  13001.     5. How do I import a text file of data into a database? --Well, you can't
  13002.        do it directly...you must use a utility, such as Oracle's SQL*Loader,
  13003.        or write a program to load the data into the database. A program to do
  13004.        this would simply go through each record of a text file, break it up
  13005.        into columns, and do an Insert into the database.
  13006.     6. What is a schema? --A schema is a logical set of tables, such as the
  13007.        Antiques database above...usually, it is thought of as simply "the
  13008.        database", but a database can hold more than one schema. For example, a
  13009.        star schema is a set of tables where one large, central table holds all
  13010.        of the important information, and is linked, via foreign keys, to
  13011.        dimension tables which hold detail information, and can be used in a
  13012.        join to create detailed reports.
  13013.     7. What are some general tips you would give to make my SQL queries and
  13014.        databases better and faster (optimized)?
  13015.           o You should try, if you can, to avoid expressions in Selects, such
  13016.             as SELECT ColumnA + ColumnB, etc. The query optimizer of the
  13017.             database, the portion of the DBMS that determines the best way to
  13018.             get the required data out of the database itself, handles
  13019.             expressions in such a way that would normally require more time to
  13020.             retrieve the data than if columns were normally selected, and the
  13021.             expression itself handled programmatically.
  13022.           o Minimize the number of columns included in a Group By clause.
  13023.           o If you are using a join, try to have the columns joined on (from
  13024.             both tables) indexed.
  13025.           o When in doubt, index.
  13026.           o Unless doing multiple counts or a complex query, use COUNT(*) (the
  13027.             number of rows generated by the query) rather than
  13028.             COUNT(Column_Name).
  13029.     8. What is normalization? --Normalization is a technique of database
  13030.        design that suggests that certain criteria be used when constructing a
  13031.        table layout (deciding what columns each table will have, and creating
  13032.        the key structure), where the idea is to eliminate redundancy of
  13033.        non-key data across tables. Normalization is usually referred to in
  13034.        terms of forms, and I will introduce only the first three, even though
  13035.        it is somewhat common to use other, more advanced forms (fourth, fifth,
  13036.        Boyce-Codd; see documentation).
  13037.  
  13038.        First Normal Form refers to moving data into separate tables where the
  13039.        data in each table is of a similar type, and by giving each table a
  13040.        primary key.
  13041.  
  13042.        Putting data in Second Normal Form involves taking out data off to
  13043.        other tables that is only dependent of a part of the key. For example,
  13044.        if I had left the names of the Antique Owners in the items table, that
  13045.        would not be in second normal form because that data would be
  13046.        redundant; the name would be repeated for each item owned, so the names
  13047.        were placed in their own table. The names themselves don't have
  13048.        anything to do with the items, only the identities of the buyers and
  13049.        sellers.
  13050.  
  13051.        Third Normal Form involves getting rid of anything in the tables that
  13052.        doesn't depend solely on the primary key. Only include information that
  13053.        is dependent on the key, and move off data to other tables that are
  13054.        independent of the primary key, and create a primary keys for the new
  13055.        tables.
  13056.  
  13057.        There is some redundancy to each form, and if data is in 3NF (shorthand
  13058.        for 3rd normal form), it is already in 1NF and 2NF. In terms of data
  13059.        design then, arrange data so that any non-primary key columns are
  13060.        dependent only on the whole primary key. If you take a look at the
  13061.        sample database, you will see that the way then to navigate through the
  13062.        database is through joins using common key columns.
  13063.  
  13064.        Two other important points in database design are using good,
  13065.        consistent, logical, full-word names for the tables and columns, and
  13066.        the use of full words in the database itself. On the last point, my
  13067.        database is lacking, as I use numeric codes for identification. It is
  13068.        usually best, if possible, to come up with keys that are, by
  13069.        themselves, self-explanatory; for example, a better key would be the
  13070.        first four letters of the last name and first initial of the owner,
  13071.        like JONEB for Bill Jones (or for tiebreaking purposes, add numbers to
  13072.        the end to differentiate two or more people with similar names, so you
  13073.        could try JONEB1, JONEB2, etc.).
  13074.     9. What is the difference between a single-row query and a multiple-row
  13075.        query and why is it important to know the difference? --First, to cover
  13076.        the obvious, a single-row query is a query that returns one row as its
  13077.        result, and a multiple-row query is a query that returns more than one
  13078.        row as its result. Whether a query returns one row or more than one row
  13079.        is entirely dependent on the design (or schema) of the tables of the
  13080.        database. As query-writer, you must be aware of the schema, be sure to
  13081.        include enough conditions, and structure your SQL statement properly,
  13082.        so that you will get the desired result (either one row or multiple
  13083.        rows). For example, if you wanted to be sure that a query of the
  13084.        AntiqueOwners table returned only one row, consider an equal condition
  13085.        of the primary key-column, OwnerID.
  13086.  
  13087.        Three reasons immediately come to mind as to why this is important.
  13088.        First, getting multiple rows when you were expecting only one, or
  13089.        vice-versa, may mean that the query is erroneous, that the database is
  13090.        incomplete, or simply, you learned something new about your data.
  13091.        Second, if you are using an update or delete statement, you had better
  13092.        be sure that the statement that you write performs the operation on the
  13093.        desired row (or rows)...or else, you might be deleting or updating more
  13094.        rows than you intend. Third, any queries written in Embedded SQL must
  13095.        be carefully thought out as to the number of rows returned. If you
  13096.        write a single-row query, only one SQL statement may need to be
  13097.        performed to complete the programming logic required. If your query, on
  13098.        the other hand, returns multiple rows, you will have to use the Fetch
  13099.        statement, and quite probably, some sort of looping structure in your
  13100.        program will be required to iterate processing on each returned row of
  13101.        the query.
  13102.    10. What are relationships? --Another design question...the term
  13103.        "relationships" (often termed "relation") usually refers to the
  13104.        relationships among primary and foreign keys between tables. This
  13105.        concept is important because when the tables of a relational database
  13106.        are designed, these relationships must be defined because they
  13107.        determine which columns are or are not primary or foreign keys. You may
  13108.        have heard of an Entity-Relationship Diagram, which is a graphical view
  13109.        of tables in a database schema, with lines connecting related columns
  13110.        across tables. See the sample diagram at the end of this section or
  13111.        some of the sites below in regard to this topic, as there are many
  13112.        different ways of drawing E-R diagrams. But first, let's look at each
  13113.        kind of relationship...
  13114.  
  13115.        A One-to-one relationship means that you have a primary key column that
  13116.        is related to a foreign key column, and that for every primary key
  13117.        value, there is one foreign key value. For example, in the first
  13118.        example, the EmployeeAddressTable, we add an EmployeeIDNo column. Then,
  13119.        the EmployeeAddressTable is related to the EmployeeStatisticsTable
  13120.        (second example table) by means of that EmployeeIDNo. Specifically,
  13121.        each employee in the EmployeeAddressTable has statistics (one row of
  13122.        data) in the EmployeeStatisticsTable. Even though this is a contrived
  13123.        example, this is a "1-1" relationship. Also notice the "has" in
  13124.        bold...when expressing a relationship, it is important to describe the
  13125.        relationship with a verb.
  13126.  
  13127.        The other two kinds of relationships may or may not use logical primary
  13128.        key and foreign key constraints...it is strictly a call of the
  13129.        designer. The first of these is the one-to-many relationship ("1-M").
  13130.        This means that for every column value in one table, there is one or
  13131.        more related values in another table. Key constraints may be added to
  13132.        the design, or possibly just the use of some sort of identifier column
  13133.        may be used to establish the relationship. An example would be that for
  13134.        every OwnerID in the AntiqueOwners table, there are one or more (zero
  13135.        is permissible too) Items bought in the Antiques table (verb: buy).
  13136.  
  13137.        Finally, the many-to-many relationship ("M-M") does not involve keys
  13138.        generally, and usually involves idenifying columns. The unusual
  13139.        occurence of a "M-M" means that one column in one table is related to
  13140.        another column in another table, and for every value of one of these
  13141.        two columns, there are one or more related values in the corresponding
  13142.        column in the other table (and vice-versa), or more a common
  13143.        possibility, two tables have a 1-M relationship to each other (two
  13144.        relationships, one 1-M going each way). A [bad] example of the more
  13145.        common situation would be if you had a job assignment database, where
  13146.        one table held one row for each employee and a job assignment, and
  13147.        another table held one row for each job with one of the assigned
  13148.        employees. Here, you would have multiple rows for each employee in the
  13149.        first table, one for each job assignment, and multiple rows for each
  13150.        job in the second table, one for each employee assigned to the project.
  13151.        These tables have a M-M: each employee in the first table has many job
  13152.        assignments from the second table, and each job has many employees
  13153.        assigned to it from the first table. This is the tip of the iceberg on
  13154.        this topic...see the links below for more information and see the
  13155.        diagram below for a simplified example of an E-R diagram.
  13156.        [Sample Simplified Entity-Relationship Diagram]
  13157.  
  13158.    11. What are some important nonstandard SQL features (extremely common
  13159.        question)? --Well, see the next section...
  13160.  
  13161.   ----------------------------------------------------------------------------
  13162.   Nonstandard SQL..."check local listings"
  13163.  
  13164.      * INTERSECT and MINUS are like the UNION statement, except that INTERSECT
  13165.        produces rows that appear in both queries, and MINUS produces rows that
  13166.        result from the first query, but not the second.
  13167.      * Report Generation Features: the COMPUTE clause is placed at the end of
  13168.        a query to place the result of an aggregate function at the end of a
  13169.        listing, like COMPUTE SUM (PRICE); Another option is to use break
  13170.        logic: define a break to divide the query results into groups based on
  13171.        a column, like BREAK ON BUYERID. Then, to produce a result after the
  13172.        listing of a group, use COMPUTE SUM OF PRICE ON BUYERID. If, for
  13173.        example, you used all three of these clauses (BREAK first, COMPUTE on
  13174.        break second, COMPUTE overall sum third), you would get a report that
  13175.        grouped items by their BuyerID, listing the sum of Prices after each
  13176.        group of a BuyerID's items, then, after all groups are listed, the sum
  13177.        of all Prices is listed, all with SQL-generated headers and lines.
  13178.      * In addition to the above listed aggregate functions, some DBMS's allow
  13179.        more functions to be used in Select lists, except that these functions
  13180.        (some character functions allow multiple-row results) are to be used
  13181.        with an individual value (not groups), on single-row queries. The
  13182.        functions are to be used only on appropriate data types, also. Here are
  13183.        some Mathematical Functions:
  13184.  
  13185.         ABS(X)       Absolute value-converts negative numbers to positive, or
  13186.                      leaves positive numbers alone
  13187.         CEIL(X)      X is a decimal value that will be rounded up.
  13188.         FLOOR(X)     X is a decimal value that will be rounded down.
  13189.         GREATEST(X,Y)Returns the largest of the two values.
  13190.         LEAST(X,Y)   Returns the smallest of the two values.
  13191.         MOD(X,Y)     Returns the remainder of X / Y.
  13192.         POWER(X,Y)   Returns X to the power of Y.
  13193.  
  13194.         ROUND(X,Y)   Rounds X to Y decimal places. If Y is omitted, X is
  13195.                      rounded to the nearest integer.
  13196.         SIGN(X)      Returns a minus if X < 0, else a plus.
  13197.         SQRT(X)      Returns the square root of X.
  13198.                                  Character Functions
  13199.  
  13200.         LEFT(<string>,X)
  13201.                              Returns the leftmost X characters of the string.
  13202.  
  13203.         RIGHT(<string>,X)
  13204.                              Returns the rightmost X characters of the
  13205.                              string.
  13206.         UPPER(<string>)
  13207.                              Converts the string to all uppercase letters.
  13208.         LOWER(<string>)
  13209.                              Converts the string to all lowercase letters.
  13210.         INITCAP(<string>)
  13211.                              Converts the string to initial caps.
  13212.         LENGTH(<string>)
  13213.                              Returns the number of characters in the string.
  13214.  
  13215.         <string>||<string>
  13216.                              Combines the two strings of text into one,
  13217.                              concatenated string, where the first string is
  13218.                              immediately followed by the second.
  13219.  
  13220.         LPAD(<string>,X,'*')
  13221.                              Pads the string on the left with the * (or
  13222.                              whatever character is inside the quotes), to
  13223.                              make the string X characters long.
  13224.  
  13225.         RPAD(<string>,X,'*')
  13226.                              Pads the string on the right with the * (or
  13227.                              whatever character is inside the quotes), to
  13228.                              make the string X characters long.
  13229.  
  13230.         SUBSTR(<string>,X,Y)
  13231.                              Extracts Y letters from the string beginning at
  13232.                              position X.
  13233.  
  13234.         NVL(<column>,<value>)
  13235.                              The Null value function will substitute <value>
  13236.                              for any NULLs for in the <column>. If the
  13237.                              current value of <column> is not NULL, NVL has
  13238.                              no effect.
  13239.  
  13240.   ----------------------------------------------------------------------------
  13241.   Syntax Summary--For Advanced Users Only
  13242.  
  13243.   Here are the general forms of the statements discussed in this tutorial,
  13244.   plus some extra important ones (explanations given). REMEMBER that all of
  13245.   these statements may or may not be available on your system, so check
  13246.   documentation regarding availability:
  13247.  
  13248.   ALTER TABLE <TABLE NAME> ADD|DROP|MODIFY (COLUMN SPECIFICATION[S]...see
  13249.   Create Table); --allows you to add or delete a column or columns from a
  13250.   table, or change the specification (data type, etc.) on an existing column;
  13251.   this statement is also used to change the physical specifications of a table
  13252.   (how a table is stored, etc.), but these definitions are DBMS-specific, so
  13253.   read the documentation. Also, these physical specifications are used with
  13254.   the Create Table statement, when a table is first created. In addition, only
  13255.   one option can be performed per Alter Table statement--either add, drop, OR
  13256.   modify in a single statement.
  13257.  
  13258.   COMMIT; --makes changes made to some database systems permanent (since the
  13259.   last COMMIT; known as a transaction)
  13260.  
  13261.   CREATE [UNIQUE] INDEX <INDEX NAME>
  13262.   ON <TABLE NAME> (<COLUMN LIST>); --UNIQUE is optional; within brackets.
  13263.  
  13264.   CREATE TABLE <TABLE NAME>
  13265.   (<COLUMN NAME> <DATA TYPE> [(<SIZE>)] <COLUMN CONSTRAINT>,
  13266.   --where SIZE is only used on certain data types (see above), and constraints
  13267.   include the following possibilities (automatically enforced by the DBMS;
  13268.   failure causes an error to be generated):
  13269.  
  13270.     1. NULL or NOT NULL (see above)
  13271.     2. UNIQUE enforces that no two rows will have the same value for this
  13272.        column
  13273.     3. PRIMARY KEY tells the database that this column is the primary key
  13274.        column (only used if the key is a one column key, otherwise a
  13275.        PRIMARY KEY (column, column, ...) statement appears after the last
  13276.        column definition.
  13277.     4. CHECK allows a condition to be checked for when data in that column is
  13278.        updated or inserted; for example, CHECK (PRICE > 0) causes the system
  13279.        to check that the Price column is greater than zero before accepting
  13280.        the value...sometimes implemented as the CONSTRAINT statement.
  13281.     5. DEFAULT inserts the default value into the database if a row is
  13282.        inserted without that column's data being inserted; for example,
  13283.        BENEFITS INTEGER DEFAULT = 10000
  13284.     6. FOREIGN KEY works the same as Primary Key, but is followed by:
  13285.        REFERENCES <TABLE NAME> (<COLUMN NAME>), which refers to the
  13286.        referential primary key.
  13287.  
  13288.   CREATE VIEW <TABLE NAME> AS <QUERY>;
  13289.  
  13290.   DELETE FROM <TABLE NAME> WHERE <CONDITION>;
  13291.  
  13292.   INSERT INTO <TABLE NAME> [(<COLUMN LIST>)]
  13293.   VALUES (<VALUE LIST>);
  13294.   ROLLBACK; --Takes back any changes to the database that you have made, back
  13295.   to the last time you gave a Commit command...beware! Some software uses
  13296.   automatic committing on systems that use the transaction features, so the
  13297.   Rollback command may not work.
  13298.  
  13299.   SELECT [DISTINCT|ALL] <LIST OF COLUMNS, FUNCTIONS, CONSTANTS, ETC.>
  13300.   FROM <LIST OF TABLES OR VIEWS>
  13301.   [WHERE <CONDITION(S)>]
  13302.   [GROUP BY <GROUPING COLUMN(S)>]
  13303.   [HAVING <CONDITION>]
  13304.   [ORDER BY <ORDERING COLUMN(S)> [ASC|DESC]]; --where ASC|DESC allows the
  13305.   ordering to be done in ASCending or DESCending order
  13306.  
  13307.   UPDATE <TABLE NAME>
  13308.   SET <COLUMN NAME> = <VALUE>
  13309.   [WHERE <CONDITION>]; --if the Where clause is left out, all rows will be
  13310.   updated according to the Set statement
  13311.  
  13312.   ----------------------------------------------------------------------------
  13313.  
  13314.